为什么 malloc() 和普通数组声明分配的堆栈帧大小不同?
Why is the assigned stack frame size is different for malloc() and normal array declaration?
我有两个非常简单的递归 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
从 堆 分配 space,而局部变量分配在 堆栈 上。假设一个 int
是 4 个字节,你的数组占用 4*5=20 个字节。当您使用 malloc
分配数组时,实际数组不是堆栈帧的一部分,但是您恢复由 malloc
返回的地址的指针是 ,这解释了为什么堆栈帧大小的差异是 20-4=16.
我有两个非常简单的递归 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
从 堆 分配 space,而局部变量分配在 堆栈 上。假设一个 int
是 4 个字节,你的数组占用 4*5=20 个字节。当您使用 malloc
分配数组时,实际数组不是堆栈帧的一部分,但是您恢复由 malloc
返回的地址的指针是 ,这解释了为什么堆栈帧大小的差异是 20-4=16.