C语言 int x[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 第 6 部分:数组和指针。

在最常见的情况下,"自动存储"是指"堆栈","动态存储"是指"堆"。但这并不总是正确的。您可能想在此问题中阅读有关此术语的一些讨论:"为什么在C++内存管理中,术语"自动"和"动态"优于术语"堆栈"和"堆"?

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新