Я немного плохо знаком с 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;
}
(По тому, как: Мне нужно это для интерпретатора, который я пишу: Работа с установленной суммой переменных и в случае, если больше необходимо, просто выделите их динамично),
Используйте 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.
}
Вы хотите использовать перераспределение (как уже указывали другие авторы). Но, к сожалению, другие плакаты не показали вам, как правильно его использовать:
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
вы не потеряли исходный указатель .
а) вы не использовали malloc для его создания, поэтому вы не можете расширить его с помощью malloc. Выполните:
mystruct *myarray = (mystruct*)malloc(sizeof( mystruct) *SIZE);
b) используйте realloc (RTM), чтобы увеличить его
Нет, не можете. Вы не можете изменить размер массива в стеке после того, как он определен: это то, что означает фиксированный размер. Или глобальный массив: из вашего примера кода не ясно, где определено myarray
.
Вы можете malloc
массив из 1000 элементов, а затем изменить его размер с помощью realloc
. Это может вернуть вам новый массив, содержащий копию данных из старого, но с дополнительным пространством в конце.