Я не уверен, правильно ли я использую функцию realloc.

В моей программе я сначала спрашиваю пользователя о размере массива и выделяю для него память с помощью malloc, а затем инициализирую его некоторыми значениями.

Затем я хочу сделать один и тот же массив в два раза больше, используя realloc. Вот мой код. Я использую realloc для изменения размера int * A правильно?

#include <stdio.h>
#include <stdlib.h>

int main(){
  int n;
  printf("Enter size of array\n");
  scanf("%d", &n);

  int *A = (int*)malloc(n*sizeof(int));     //dynamically allocated array
  for (int i = 0; i < n; i++)               //assign values to allocated memory
  { 
    A[i] = i + 1;
  }

  A = (int*)realloc(A, 2*sizeof(int));     //make the array twice the size
  free(A);
}
0
Ivan Lendl 28 Май 2017 в 08:25

2 ответа

Лучший ответ
  • При использовании malloc() не приводите возвращаемое значение как сказано здесь
  • Вы не используете правильный размер. Здесь int *A = (int*)malloc(n*sizeof(int)); размер, указанный для malloc, равен n*sizeof(int). Если вы хотите получить вдвое больший размер, вы должны вызывать realloc() с n*sizeof(int)*2 вместо 2*sizeof(int)
  • Обработка ошибки realloc(). В случае сбоя realloc(A, new_size), A == NULL и у вас будет утечка памяти. Итак, используйте другой указатель B, проверьте if (B != NULL) и затем назначьте A = B (old_size = new_size). Если B == NULL справиться с ошибкой выделения
1
CIsForCookies 28 Май 2017 в 05:58

В этом случае проще удвоить n перед malloc, чтобы у вас не было использования realloc, потому что вы знаете, что собираетесь удвоить размер массива. Использование realloc может замедлить работу программы, потому что если вы сделаете ее длиннее, а адреса после выделенных в данный момент ячеек памяти не будут свободными, то весь массив будет перемещен. Также у вас есть изменение последней строки, как это было предложено до меня.

1
Urudin 28 Май 2017 в 05:44