2017-01-04 74 views
18

这两个代码行的内存使用情况是否有区别?int x [10]分配多少内存?

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

第一行应为10个整数和1个指针分配内存。但我不确定第二个。这是否也会为10个整数和1个指针分配内存,或者只分配10个内存?

回答

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?"

+7

根据编译器的工作原理,它可能会或可能不会在堆栈中为指针“* a”分配任何内存。如果你在任何地方使用'&a',是的,但是否则所有投注都关闭。 –

+0

谢谢。我会赞扬我的回答。 – giusti

+1

@DietrichEpp再读一遍,我可能误解了你的评论。你能给我一个具体的例子吗? – giusti

8

在第一种情况下,a本身占用sizeof(int *)字节的自动存储空间,并且指向10 * sizeof(int)字节的动态存储。

在后一种情况下,b占用10 * sizeof(int)字节的自动存储。因为b是一个数组,所以没有指针。

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

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