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

Sup*_*mal 19 c malloc

这两个代码行的内存使用有什么不同吗?

int *a = malloc( 10 * sizeof(int) );
int b[10];
Run Code Online (Sandbox Code Playgroud)

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

giu*_*sti 21

简单的说:

int *a = malloc( 10 * sizeof(int) );
Run Code Online (Sandbox Code Playgroud)

sizeof(int*)为指针分配至少字节的自动存储空间*a.当malloc被调用时,这将至少分配sizeof(int) * 10字节的动态存储为你的程序.

另一方面:

int b[10];
Run Code Online (Sandbox Code Playgroud)

至少分配sizeof(int) * 10自动存储的字节数.这里没有指针.b在表达式中使用名称(例如a = b:)时,它会衰减为指针.但它a是一个指针,b是一个数组.在C FAQ上查看:C-FAQ Sec.6:数组和指针.

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

  • 它可能会也可能不会在堆栈中为指针`*a`分配任何内存,具体取决于编译器的工作方式.如果你在任何地方使用`&a`,是的,否则所有的赌注都会被取消. (7认同)
  • @giusti:一方面可以优化变量. (4认同)
  • 但对任何变量都是如此.如果不接受指针的地址,指针是否有任何特殊之处可以使分配有所不同? (3认同)

dbu*_*ush 8

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

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

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

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