C:使用malloc扩展数组

Mal*_*Ock 20 c arrays 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;
}
Run Code Online (Sandbox Code Playgroud)
  • 上面的例子应该说明我想要完成的事情.

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

i_a*_*orf 19

使用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.
   }
Run Code Online (Sandbox Code Playgroud)

  • `x = realloc(x,newsize)`是一个等待发生的内存泄漏. (6认同)
  • 您不必首先使用`malloc()`分配 - "如果ptr是空指针,则realloc函数的行为类似于指定大小的malloc函数" (5认同)
  • 编程很难.:) (4认同)

R S*_*hko 16

你想使用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;
}
Run Code Online (Sandbox Code Playgroud)

你需要使用tmp_ptr,如果realloc失败,你不会丢失原始指针.


Ste*_*sop 7

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

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