int x [10]分配了多少内存?

时间:2017-01-04 15:50:50

标签: c malloc

这两个代码行的内存使用量是否有任何差异?

int *a = malloc( 10 * sizeof(int) );
int b[10];

第一行应为10个整数和1个指针分配内存。但我不确定第二个。那还会为10个整数和1个指针分配内存,还是只有10个整数?

2 个答案:

答案 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是一个数组,所以没有指针。

所以第一种情况使用更多的总字节数,但在堆栈上使用的更少(假设堆栈用于自动存储)。

如果使用的总字节数相对较小,则自动存储通常很好。对于较大的量,优选动态存储。特别是对于堆栈实现,过多的自动变量太大会使堆栈溢出。