我对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;
}
(顺便说一下:我需要这个我写的解释器:使用固定数量的变量,如果需要更多,只需动态分配它们)
答案 0 :(得分:18)
使用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.
}
答案 1 :(得分:14)
你想使用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
失败,您就不会丢失原始指针。
答案 2 :(得分:7)
myarray
。
你可以malloc
一个1000个元素的数组,然后用realloc
调整它的大小。这可以返回一个新数组,其中包含旧数据的副本,但最后会有额外的空间。
答案 3 :(得分:1)
a)您没有使用malloc来创建它,因此您无法使用malloc进行扩展。做:
mystruct *myarray = (mystruct*)malloc(sizeof( mystruct) *SIZE);
b)使用realloc(RTM)使其更大