【发布时间】:2017-05-18 23:41:06
【问题描述】:
这两个代码行的内存使用有什么区别吗?
int *a = malloc( 10 * sizeof(int) );
int b[10];
第一行应该为 10 个整数和 1 个指针分配内存。但我不确定第二个。这还会为 10 个整数和 1 个指针分配内存,还是只为 10 个整数分配内存?
【问题讨论】:
这两个代码行的内存使用有什么区别吗?
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 Sec. 6: arrays and pointers。
在最常见的情况下,“自动存储”是指“栈”,“动态存储”是指“堆”。但这并不总是正确的。您可能想在这个问题中阅读一些关于此术语的讨论:"Why are the terms “automatic” and “dynamic” preferred over the terms “stack” and “heap” in C++ memory management?"。
【讨论】:
*a 分配任何内存,具体取决于编译器的工作方式。如果你在任何地方使用&a,是的,否则所有的赌注都会被取消。
在第一种情况下,a 本身占用了sizeof(int *) 字节的自动存储空间,它指向了10 * sizeof(int) 字节的动态存储空间。
在后一种情况下,b 占用10 * sizeof(int) 字节的自动存储空间。因为b是一个数组,所以没有指针。
所以第一种情况使用了更多的总字节数,但在堆栈上更少(假设堆栈正在用于自动存储)。
如果使用的总字节数相对较少,自动存储通常没问题。对于较大的数量,动态存储是首选。特别是对于堆栈实现,自动变量过多且太大会溢出堆栈。
【讨论】: