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), чтобы сделать его больше