перераспределение памяти с 0 - PullRequest
0 голосов
/ 29 марта 2011

возможно ли перераспределить память из указателя на NULL в C?

int *v = 0;
for(i = 0; i < 10; i++)
  v = (int *) realloc(v, (i+1)*sizeof(int));

Ответы [ 6 ]

2 голосов
/ 29 марта 2011

из стандарта

7.20.3.4 / 3 ... Если ptr является нулевым указателем, функция realloc ведет себя как функция malloc для указанного размера.

2 голосов
/ 29 марта 2011

Если ptr равен NULL, то вызов эквивалентен malloc (size) для всех значений размера.

Источник: man 3 realloc

2 голосов
/ 29 марта 2011

"Если ptr равен NULL, функция ведет себя точно так же, как malloc, назначая новый блок байтов размера и возвращая указатель на его начало."

http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

Кстати, я знаю, что этот код предназначен только для вопроса, но вы всегда должны проверять возвращаемое значение realloc перед обновлением вашего указателя:

int *p,*tmp;

tmp = (int *)realloc(p, nBytes);
if(tmp){
  p = tmp;
}
else{
  //Out of memory!
}

Если вы этого не сделаете, при сбое realloc вы потеряете ссылку на выделенную память.

1 голос
/ 29 марта 2011

Из справочной страницы :

Если ptr равен NULL, вызов эквивалентен malloc (size);если размер равен нулю, вызов эквивалентен свободному (ptr).Если ptr не равен NULL, он должен быть возвращен более ранним вызовом malloc (), calloc () или realloc ().

Однако вы не должны забывать, что realloc() может return NULL, если не удается изменить размер памяти.Код, который вы опубликовали, может привести к тому, что в этом случае будет выделено более одного блока памяти, поскольку возвращаемое значение NULL будет возвращено в realloc(), который затем выделит новый блок.(Надеюсь, вы не используете этот код в любом случае ...)

0 голосов
/ 29 марта 2011

Из realloc Страница man :

realloc () изменяет размер блока памяти, на который указывает ptr, на размер в байтах.Содержимое будет неизменным до минимума старого и нового размеров;вновь выделенная память будет неинициализирована.Если ptr равен NULL, вызов эквивалентен malloc (size);если размер равен нулю, вызов эквивалентен свободному (ptr).Если ptr не равен NULL, он должен быть возвращен более ранним вызовом malloc (), calloc () или realloc ().Если указанная область была перемещена, выполняется освобождение (ptr).

0 голосов
/ 29 марта 2011

да.

из здесь

Если ptr - нулевой указатель, realloc () ведет себя как malloc () для указанный размер.

...