C: Расширение массива с помощью malloc

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

Пример:

#define SIZE 1000
struct mystruct
{
  int a;
  int b;
  char c;
};
mystruct myarray[ SIZE ];
int myarrayMaxSize = SIZE;
....
if ( i > myarrayMaxSize )
{
   // malloc another SIZE (1000) elements
   myarrayMaxSize += SIZE;
}
  • В приведенном выше примере должно быть ясно, что я хочу выполнить.

(Кстати: мне нужно это для интерпретатора, который я пишу: работайте с фиксированным количеством переменных и в случае необходимости больше, просто распределите их динамически)

Ответы

Ответ 1

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

   size_t myarray_size = 1000;
   mystruct* myarray = malloc(myarray_size * sizeof(mystruct));

   myarray_size += 1000;
   mystruct* myrealloced_array = realloc(myarray, myarray_size * sizeof(mystruct));
   if (myrealloced_array) {
     myarray = myrealloced_array;
   } else {
     // deal with realloc failing because memory could not be allocated.
   }

Ответ 2

Вы хотите использовать realloc (как уже указывали другие плакаты). Но, к сожалению, другие плакаты не показали вам, как правильно его использовать:

POINTER *tmp_ptr = realloc(orig_ptr, new_size);
if (tmp_ptr == NULL)
{
    // realloc failed, orig_ptr still valid so you can clean up
}
else
{
    // Only overwrite orig_ptr once you know the call was successful
    orig_ptr = tmp_ptr;
}

Вам нужно использовать tmp_ptr, чтобы при отсутствии realloc вы не потеряли исходный указатель.

Ответ 3

Нет, вы не можете. Вы не можете изменить размер массива в стеке после его определения: этот тип фиксированного размера. Или глобальный массив: либо не видно из вашего примера кода, где myarray определен.

Вы можете malloc массив из 1000 элементов, а затем изменить его размер с помощью realloc. Это может вернуть вам новый массив, содержащий копию данных из старого, но с дополнительным пространством в конце.

Ответ 4

a) вы не использовали malloc для его создания, поэтому вы не можете расширять его с помощью malloc. У:

  mystruct *myarray = (mystruct*)malloc(sizeof( mystruct) *SIZE);

b) используйте realloc (RTM), чтобы сделать его больше