C: Расширение массива с помощью malloc - PullRequest
19 голосов
/ 01 мая 2010

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

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

Ответы [ 4 ]

18 голосов
/ 01 мая 2010

Используйте 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.
   }
15 голосов
/ 01 мая 2010

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

7 голосов
/ 01 мая 2010

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

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

1 голос
/ 01 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...