gpt4 book ai didi

c - 为什么 malloc() 和普通数组声明分配的堆栈帧大小不同?

转载 作者:行者123 更新时间:2023-12-02 02:42:45 25 4
gpt4 key购买 nike

我有两个非常简单的递归 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 分配空间,而局部变量在堆栈 上分配。假设一个 int 是 4 个字节,你的数组占用 4*5=20 个字节。当您使用 malloc 分配数组时,实际数组不是堆栈帧的一部分,但是您恢复 malloc 返回的地址的指针 ,这就解释了为什么堆栈帧大小的差异是 20-4=16。

关于c - 为什么 malloc() 和普通数组声明分配的堆栈帧大小不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58153619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com