malloc还是普通的数组定义?

Ant*_*cia 4 c arrays malloc

什么时候我应该在C中使用malloc而不是普通的数组定义?

我无法理解之间的区别:

int a[3]={1,2,3}
int array[sizeof(a)/sizeof(int)]
Run Code Online (Sandbox Code Playgroud)

和:

array=(int *)malloc(sizeof(int)*sizeof(a));
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 16

一般情况下,使用malloc()时:

  • 数组太大而无法放在堆栈上
  • 数组的生命周期必须比创建它的范围更长

否则,使用堆栈分配的数组.


Hri*_*iev 5

int a[3]={1,2,3}
int array[sizeof(a)/sizeof(int)]
Run Code Online (Sandbox Code Playgroud)

如果用作局部变量,都aarray将在栈上分配.堆栈分配有其优点和缺点:

  • 亲:它非常快 - 它只需要一次寄存器减法操作来创建堆栈空间和一次寄存器加法操作来回收它
  • con:堆栈大小通常是有限的(并且在Windows上的链接时也是固定的)

在这两种情况下,每个数组中的元素数量是一个编译时常量:3显然是一个常量,而sizeof(a)/sizeof(int)在编译时可以计算,因为声明时大小a和大小int都是已知的array.

如果仅在运行时知道元素的数量,或者当数组的大小太大而无法安全地适应堆栈空间时,则使用堆分配:

array=(int *)malloc(sizeof(int)*sizeof(a));
Run Code Online (Sandbox Code Playgroud)

正如已经指出的那样,这应该是malloc(sizeof(a))因为它的大小a已经是它所占用的字节数而不是元素的数量,因此sizeof(int)不需要额外的乘法.

堆分配和释放是相对昂贵的操作(与堆栈分配相比),应该仔细权衡它提供的好处,例如在紧密循环中被多次调用的代码中.

现代C编译器支持C标准的C99版本,它引入了所谓的可变长度数组(或VLA),类似于其他语言中可用的类似功能.VLA的大小在运行时指定,就像在这种情况下:

void func(int n)
{
   int array[n];
   ...
}
Run Code Online (Sandbox Code Playgroud)

array仍然在堆栈上分配,就好像通过调用分配了数组的内存一样alloca(3).