Форум программистов, компьютерный форум CyberForum.ru

Выход за предел массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Ne0nX
0 / 0 / 0
Регистрация: 10.06.2012
Сообщений: 18
01.08.2012, 03:18     Выход за предел массива #1
Здравствуйте, меня заинтересовала одна особенность массивов, а именно то что они не проверяются на количество элементов, из этого исходит то что с их помошью мы можем изменить/инициализировать совершенно не относящуюся к этому массиву переменную.

Я бы хотел узнать возможно ли это ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
01.08.2012, 03:54     Выход за предел массива #2
Вполне...
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.08.2012, 04:53     Выход за предел массива #3
C
1
strcpy ((char*)0x1234, "hello world!");
а вы про границы массива..
just_dude
11 / 11 / 2
Регистрация: 15.01.2012
Сообщений: 104
02.08.2012, 01:06     Выход за предел массива #4
int mas[]=new mas[9]
int *p=&mas;


for (int i=0; i<10; i++)
cout<<*(p+i);

точно за пределы выйдете
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.08.2012, 01:10     Выход за предел массива #5
Цитата Сообщение от Ne0nX Посмотреть сообщение
Здравствуйте, меня заинтересовала одна особенность массивов, а именно то что они не проверяются на количество элементов, из этого исходит то что с их помошью мы можем изменить/инициализировать совершенно не относящуюся к этому массиву переменную.

Я бы хотел узнать возможно ли это ?
а в принципе возможно и такое:

C++
1
2
3
4
class ClassA;
...
ClassA *pClA = NULL;
pClA->method0 ();
и никто не проверяет, инициализирован ли указатель!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 01:16     Выход за предел массива #6
Цитата Сообщение от just_dude Посмотреть сообщение
int mas[]=new mas[9]
int *p=&mas;
Это какой компилятор такое принимает?
just_dude
11 / 11 / 2
Регистрация: 15.01.2012
Сообщений: 104
02.08.2012, 10:27     Выход за предел массива #7
Добавлено через 52 секунды
Цитата Сообщение от alsav22 Посмотреть сообщение
Это какой компилятор такое принимает?
извините


C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"
#include "iostream"
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int *mas=new int[8];
 
    for (int i=0; i<9; i++)
        *(mas+i)=i;
 
    for (int i=0; i<11; i++)
        cout<<*(mas+i)<<endl;
    
    char b;
    cin>>b;
    delete[] mas;
    return 0;
}
Dem0Men
 Аватар для Dem0Men
9 / 9 / 0
Регистрация: 19.02.2012
Сообщений: 32
02.08.2012, 12:33     Выход за предел массива #8
У вас же есть STL и векторы, а вы исполььзуете голые C-массивы....
Используйте
C++
1
std::vector<T>
и ни о чём не думайте!
just_dude
11 / 11 / 2
Регистрация: 15.01.2012
Сообщений: 104
02.08.2012, 12:36     Выход за предел массива #9
Цитата Сообщение от Dem0Men Посмотреть сообщение
У вас же есть STL и векторы, а вы исполььзуете голые C-массивы....
Используйте
C++
1
std::vector<T>
и ни о чём не думайте!
с++ всё сделает за Вас
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
02.08.2012, 12:40     Выход за предел массива #10
с++ всё сделает за Вас
И даже внесет в код ошибки

just_dude читайте про STL ( обратите внимание на случаи невалидности итераторов и перераспределение памяти в vector-е)
just_dude
11 / 11 / 2
Регистрация: 15.01.2012
Сообщений: 104
02.08.2012, 13:36     Выход за предел массива #11
Avazart, хорошо,спасибо
Ne0nX
0 / 0 / 0
Регистрация: 10.06.2012
Сообщений: 18
02.08.2012, 18:24  [ТС]     Выход за предел массива #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <conio.h>
using namespace std;
 
void Create (int&,int*);
bool keyboard (int&,int&);
 
void main () {
    int mass[5] = { 1,2,3,4,5 };
    int abc = 5;
 
    setlocale(0,"rus");
 
    Create(abc,mass);
}
 
void Create (int &abc,int *mass) {
    int link = 0;
    bool dowhile = true;
    do {
        system("cls");
        cout<<"Наша переменная: "<<abc<<" Ее адрес: "<<&abc<<endl;
 
        cout<<"\nЯчейка массива: mass["<<link<<"]\n"
            <<"Данные: "<<mass[link]<<endl
            <<"Адрес: "<<&mass+link<<endl;
 
        dowhile = keyboard (link,mass[link]);
    }
    while (dowhile);
}
 
bool keyboard (int &link,int&eq) {
    int per = _getch();
    switch (per) {
        case 13: return false;
            break;
        case 224: 
            {
                per = _getch();
                switch (per) {
                    case 75: link--;
                        break;
                    case 77: link++;
                        break;
                }
            }
            break;
        case 53: cout<<"Измените переменную: ";cin>>eq;
            break;
    }
    return true;
}
Вот накидал код но переменную он не меняет =((
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
02.08.2012, 18:28     Выход за предел массива #13
Про какую перемнную речь?
Ne0nX
0 / 0 / 0
Регистрация: 10.06.2012
Сообщений: 18
02.08.2012, 20:12  [ТС]     Выход за предел массива #14
Возможно написал бред выше но с помощью данной программы мы должны находить адрес переменной abc и изменять ее по адресу

Добавлено через 1 час 28 минут
Все разобрался, благодарю всем кто участвовал.

Кому интересно, у меня ошибка в 27 строке вместо &mass+link. mass+link или &mass[link]
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2012, 18:17     Выход за предел массива
Еще ссылки по теме:

C++ Проверить на выход за границы массива
Выход за границы массива C++
C++ Массив. Задачка. Выход за пределы массива

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
15.10.2012, 18:17     Выход за предел массива #15
Что будет, если в унитаз поезда на полном ходу бросить лом?
Yandex
Объявления
15.10.2012, 18:17     Выход за предел массива
Ответ Создать тему
Опции темы

Текущее время: 06:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru