Подтвердить что ты не робот

Как использовать 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 первой. Это просто упрощенный пример.

4b9b3361

Ответ 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;

... ...

}