这两个代码行的内存使用量是否有任何差异?
int *a = malloc( 10 * sizeof(int) );
int b[10];
第一行应为10个整数和1个指针分配内存。但我不确定第二个。那还会为10个整数和1个指针分配内存,还是只有10个整数?
答案 0 :(得分:21)
简单地说:
int *a = malloc( 10 * sizeof(int) );
为指针sizeof(int*)
分配至少*a
字节的自动存储空间。调用malloc
时,这将为您的程序分配至少sizeof(int) * 10
字节的动态存储空间。
另一方面:
int b[10];
分配至少sizeof(int) * 10
字节的自动存储空间。这里没有指针。在表达式中使用名称b
时(例如:a = b
),它会衰减为指针。但是a
是一个指针而b
是一个数组。请在C FAQ上查看:C-FAQ Sec. 6: arrays and pointers。
在最常见的情况下,"自动存储"表示"堆栈"和"动态存储"意味着"堆"。但这并非总是如此。您可能希望在此问题中阅读有关此术语的一些讨论:"Why are the terms “automatic” and “dynamic” preferred over the terms “stack” and “heap” in C++ memory management?"。
答案 1 :(得分:8)
在第一种情况下,a
本身占用sizeof(int *)
字节的自动存储空间,并且指向10 * sizeof(int)
字节的动态存储空间。
在后一种情况下,b
占用10 * sizeof(int)
字节的自动存储空间。因为b
是一个数组,所以没有指针。
所以第一种情况使用更多的总字节数,但在堆栈上使用的更少(假设堆栈用于自动存储)。
如果使用的总字节数相对较小,则自动存储通常很好。对于较大的量,优选动态存储。特别是对于堆栈实现,过多的自动变量太大会使堆栈溢出。