什么时候我应该在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)
int a[3]={1,2,3}
int array[sizeof(a)/sizeof(int)]
Run Code Online (Sandbox Code Playgroud)
如果用作局部变量,都a和array将在栈上分配.堆栈分配有其优点和缺点:
在这两种情况下,每个数组中的元素数量是一个编译时常量: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).