我有两个非常简单的递归C程序。我正在检查系统分配给每个递归帧的堆栈帧大小。但是我遇到了我不了解的东西。
当我在递归函数中创建大小为5的局部数组时,系统将为每个帧分配48个字节。
当我创建一个指针并分配与size*sizeof()
相同数量的内存时,系统将为每个帧分配32个字节。
我检查的方法是,将C代码编译为程序集,并查看分配的字节数。我对差异的猜测是,malloc
是从堆分配的,而普通数组声明是从堆栈分配的。因此,我认为这两个内存部分可能具有不同的过程?
我期望分配的内存是相同的,但是它们是不同的。
我从主函数调用它们。
void RecursiveFunction( int n )
{
int *point;
point = (int *)malloc(sizeof(int)*5);
if ( n > 1)
RecursiveFunction( --n );
return;
}
和
#include <stdio.h>
#include <stdlib.h>
void RecursiveFunction( int n )
{
int arr[5];
if ( recursion_times > 1)
RecursiveFunction( --n );
return;
}
为了完整性:
malloc
从heap分配空间,而局部变量在stack上分配。假设int
为4字节,则数组占用4 * 5 = 20字节。当您使用malloc
分配数组时,实际的数组不是堆栈帧的一部分,而是用于还原malloc
is返回的地址的指针,这说明了堆栈帧大小为何不同的原因是20-4 = 16。