Realloc - что же такое..

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Закрыто
borN_free
Сообщения: 10
Зарегистрирован: 15 апр 2009, 01:48

Захотелось мне в цикле добавлять к массиву память .. вообщем весь код писать не буду, интересует одна вещь, а именно:

Код: Выделить всё

int* mass=(int*)malloc(sizeof(int)); // выделяем память для одного инта
if (mass!=NULL)
     mass=(int*) realloc (mass, 5*sizeof(int)); // еще для 4. Всего 5
при просмотре в дебаге указателя mass и выражения sizeof(mass) обнаружил:

sizeof(mass) не меняется, сколько бы не выделял
mass содержит лишь первый элемент ..

В чем дело, объясните пожалуйсто..
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

mass объявлен как "указатель на int", так что его размер, разумеется, всегда будет равен 4.

mass содержит не "первый элемент", а УКАЗАТЕЛЬ на первый элемент. Точнее (т.к. в C массивы индексируются от 0), "указатель на элемент со смещением ноль".

Для получения УКАЗТЕЛЕЙ на последующие нужно использовать (mass+1), (mass+2) и т.д.

Т.е., нулевой элемент: *mass
первый элемент: *(mass+1)
второй элемент: *(mass+2)
borN_free
Сообщения: 10
Зарегистрирован: 15 апр 2009, 01:48

на счет sizeof(mass) спасибо, тупанул тут я. все остальное я знал :) , просто в некоторых компиляторах если в окно watch добавить указатель на массив, там показываются все его элементы..

и так вопрос опять же, массив все таки расширяется, при коде, который я написал?
Спасибо
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

borN_free писал(а):и так вопрос опять же, массив все таки расширяется, при коде, который я написал?
А почему он НЕ должен расшириться?
Формально говоря, расширяется кусок выделенной памяти. А уж как этот кусок интерпретировать - как массив или как-то еще - это уже другой вопрос ("кухня" того, кто эту память выделял).
Еще точно не помню, сохраняются ли в новом куске памяти данные, которые были в старом куске. Интуитивно кажется, что система должна об этом позаботится. Но наверняка не помню.
borN_free
Сообщения: 10
Зарегистрирован: 15 апр 2009, 01:48

Все работает, я разобрался. Спасибо. Можно закрыть тему.
Typedite
Сообщения: 4
Зарегистрирован: 12 сен 2009, 22:55

но этот вариант мне не подходит. Может, есть ещё варианты?
кстати на этом форуме есть информация о галактической браузерной игре http://netassault.ru мне вот ли чно мне ничего не понятно не понимаю как играть
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

&quot писал(а):Еще точно не помню, сохраняются ли в новом куске памяти данные, которые были в старом куске.
Сохраняются - гарантия стандарта.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Закрыто