这两个代码行的内存使用量有什么区别吗?
int *a = malloc( 10 * sizeof(int) );
int b[10];
第一行应为 10 个整数和 1 个指针分配内存。但我不确定第二个。这是否也会为 10 个整数和 1 个指针分配内存,或者只为 10 个整数分配内存?
简单地说:
int *a = malloc( 10 * sizeof(int) );
为指针*a
分配至少 sizeof(int*)
字节的自动存储。调用 malloc
时,这将为程序分配至少 sizeof(int) * 10
字节的动态存储。
另一方面:
int b[10];
分配至少 sizeof(int) * 10
字节的自动存储。这里没有指针。在表达式中使用名称b
(例如:a = b
)时,它会衰减为指针。但是a
是一个指针,b
是一个数组。在 C 常见问题解答中查看此内容:C-FAQ 第 6 部分:数组和指针。
在最常见的情况下,"自动存储"是指"堆栈","动态存储"是指"堆"。但这并不总是正确的。您可能想在此问题中阅读有关此术语的一些讨论:"为什么在C++内存管理中,术语"自动"和"动态"优于术语"堆栈"和"堆"?
在第一种情况下,a
本身占用 sizeof(int *)
字节的自动存储,这指向 10 * sizeof(int)
字节的动态存储。
在后一种情况下,b
占用 10 * sizeof(int)
字节的自动存储。 因为b
是一个数组,所以没有指针。
因此,第一种情况使用更多的总字节数,但在堆栈上使用更少的字节数(假设堆栈用于自动存储)。
如果使用的总字节数相对较小,则自动存储通常没问题。 对于较大的数量,首选动态存储。 特别是对于堆栈实现,具有太多太大的自动变量可能会使堆栈溢出。