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

问题描述 投票:3回答:1

我有两个非常简单的递归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;
}
c recursion memory-management stack heap
1个回答
0
投票

为了完整性:

mallocheap分配空间,而局部变量在stack上分配。假设int为4字节,则数组占用4 * 5 = 20字节。当您使用malloc分配数组时,实际的数组不是堆栈帧的一部分,而是用于还原malloc is返回的地址的指针,这说明了堆栈帧大小为何不同的原因是20-4 = 16。

© www.soinside.com 2019 - 2024. All rights reserved.