这两个代码行的内存使用有什么不同吗?
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
它本身占用sizeof(int *)
自动存储的字节,并指向10 * sizeof(int)
动态存储的字节.
在后一种情况下,b
占用10 * sizeof(int)
自动存储的字节数.因为b
是一个数组,所以没有指针.
因此,第一种情况使用更多的总字节数,但在堆栈上使用的更少(假设堆栈用于自动存储).
如果使用的总字节数相对较小,则自动存储通常很好.对于较大的量,优选动态存储.特别是对于堆栈实现,过多的自动变量可能会溢出堆栈.