这两个代码行的内存使用情况是否有区别?int x [10]分配多少内存?
int *a = malloc(10 * sizeof(int));
int b[10];
第一行应为10个整数和1个指针分配内存。但我不确定第二个。这是否也会为10个整数和1个指针分配内存,或者只分配10个内存?
这两个代码行的内存使用情况是否有区别?int x [10]分配多少内存?
int *a = malloc(10 * sizeof(int));
int b[10];
第一行应为10个整数和1个指针分配内存。但我不确定第二个。这是否也会为10个整数和1个指针分配内存,或者只分配10个内存?
简而言之:
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?"。
在第一种情况下,a
本身占用sizeof(int *)
字节的自动存储空间,并且指向10 * sizeof(int)
字节的动态存储。
在后一种情况下,b
占用10 * sizeof(int)
字节的自动存储。因为b
是一个数组,所以没有指针。
因此,第一种情况使用更多的总字节数,但在堆栈上较少(假设堆栈正在用于自动存储)。
如果正在使用的字节总数相对较小,则自动存储通常很好。对于更大的数量,动态存储是首选。特别是对于堆栈实现,如果太多的自动变量可能会溢出堆栈。
根据编译器的工作原理,它可能会或可能不会在堆栈中为指针“* a”分配任何内存。如果你在任何地方使用'&a',是的,但是否则所有投注都关闭。 –
谢谢。我会赞扬我的回答。 – giusti
@DietrichEpp再读一遍,我可能误解了你的评论。你能给我一个具体的例子吗? – giusti