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; } 
  • 上面的例子应该说明我想要完成的事情。

(顺便说一句:我需要这个用于我编写的解释器:使用固定数量的变量,如果需要更多变量,只需动态分配它们)

使用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. } 

你想使用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失败时,您不会丢失原始指针。

不,你不能。 一旦定义了数组,就无法更改数组的大小:这就是固定大小的含义。 或者是全局数组:从代码示例中不清楚myarray的定义位置。

你可以malloc一个1000元素的数组,然后用realloc调整它的大小。 这可以返回一个新数组,其中包含旧数据的副本,但最后会有额外的空间。

a)您没有使用malloc来创建它,因此您无法使用malloc进行扩展。 做:

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

b)使用realloc(RTM)使其更大