Оригинальный вопросПравильно ли это использование realloc?
Могу ли я использовать realloc()
функцию как следующий код:
int *ptr, i, num=5;
for (i=0; i<num; i++)
void *nptr = realloc (ptr, (i+1) * sizeof(int));
Оригинальный вопросПравильно ли это использование realloc?
Могу ли я использовать realloc()
функцию как следующий код:
int *ptr, i, num=5;
for (i=0; i<num; i++)
void *nptr = realloc (ptr, (i+1) * sizeof(int));
нет, вы должны инициализировать ptr
в начале, а затем присвоить новое значение
int *ptr = 0;
for (unsigned i=0; i<5; i++) {
void *nptr = realloc (ptr, (i+1) * sizeof(int));
if (nptr) ptr = nptr;
else abort();
}
В противном случае при первом вызове вы можете передать некоторое случайное значение realloc
. И память, которую вы выделили в последующих вызовах, просто будет потеряна.
Нет, вы должны инициализировать указатель ptr
и nptr
с NULL. И объявите цикл nptr before for. ваш код должен быть как:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *ptr=NULL, i, num=5;
void *nptr=NULL;
for (i=0; i<num; i++)
{
nptr = realloc (ptr, (i+1) * sizeof(int));
if (NULL != nptr)
ptr = nptr;
}
}
этого недостаточно. –
PLZ объяснить вниз голосом .. –
@Abhiteshkhatri В цикле, каждый раз 'ptr' является' NULL'. В случае, если 'ptr' является нулевым указателем, функция ведет себя как malloc, назначая новый блок байтов размера и возвращает указатель на его начало. – BlackMamba
No. После того, как оригинальный указатель используется в перераспределить, только возвращаемое значение (будем надеяться) использовать для следующей итерации. (и ваш исходный указатель не инициализирован, другая поездка в неопределенное поведение). Он также пропускает память, как сито. Как ни странно, инициализация 'ptr' до NULL приведет к удалению UB, но у вас все равно будет утечка. – WhozCraig
'ptr' не инициализируется. – BLUEPIXY