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;
}
  • Вышеупомянутый пример должен ясно дать понять, что я хочу выполнить.

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

20
задан Ébe Isaac 10 November 2016 в 13:12
поделиться

4 ответа

Используйте 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.
   }
19
ответ дан 29 November 2019 в 23:40
поделиться

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

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 вы не потеряли исходный указатель .

16
ответ дан 29 November 2019 в 23:40
поделиться

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

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

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

1
ответ дан 29 November 2019 в 23:40
поделиться

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

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

7
ответ дан 29 November 2019 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: