Как использовать realloc в функции в C
Основываясь на том, что я узнал здесь: Манипуляция динамическим массивом через функции в C.
void test(int data[])
{
data[0] = 1;
}
int main(void)
{
int *data = malloc(4 * sizeof *data);
test(data);
return 0;
}
Это прекрасно работает. Тем не менее, я также пытаюсь использовать realloc
в функции.
void increase(int data[])
{
data = realloc(data, 5 * sizeof *data);
}
Это выполняется, но программа запускается при запуске.
Вопрос
Как мне использовать realloc в функции?
Я понимаю, что я должен присвоить результат realloc
переменной и проверить, является ли она NULL
первой. Это просто упрощенный пример.
Ответы
Ответ 1
Вы хотите изменить значение int*
(ваш массив), поэтому вам нужно передать указатель на него в вашу функцию increase
:
void increase(int** data)
{
*data = realloc(*data, 5 * sizeof int);
}
Код вызова будет выглядеть следующим образом:
int *data = malloc(4 * sizeof *data);
/* do stuff with data */
increase(&data);
/* more stuff */
free(data);
Ответ 2
Имейте в виду разницу между указателем и массивом.
Массив - это патрон памяти в стеке, и все. Если у вас есть массив:
int arr[100];
Тогда arr является адресом памяти, но также & arr является адресом памяти, и этот адрес памяти является постоянным, не сохраняется в каком-либо местоположении. Таким образом, вы не можете сказать arr = NULL, так как arr не является переменной что указывает на что-то. Это просто символический адрес: адрес, где начинается массив. Вместо указателя есть собственная память и может указывать на адреса памяти.
Достаточно, чтобы вы изменили int [] на int *.
Кроме того, переменные передаются копией, поэтому вам нужно передать int ** функции.
О том, как использовать realloc, все дидактические примеры включают следующее:
- Использовать realloc;
- Проверьте, является ли это NULL. В этом случае используйте perror и выйдите из программы;
- Если это не NULL, используйте выделенную память;
- Освободите память, когда она вам больше не понадобится.
Итак, это будет хороший пример:
int* chuck= (int*) realloc (NULL, 10*sizeof(int)); // Acts like malloc,
// casting is optional but I'd suggest it for readability
assert(chuck);
for(unsigned int i=0; i<10; i++)
{
chunk[i]=i*10;
printf("%d",chunk[i]);
}
free(chunk);
Ответ 3
Оба кода очень проблематичны, если вы используете один и тот же указатель для отправки и получения из realloc, если он не работает, вы потеряете указатель, чтобы освободить его позже.
вы должны сделать что-то вроде этого:
{
...
...
more = realloc(area , size);
if( more == NULL )
free(area);
else
area=more;
...
...
}