为可变大小数组分配内存的机制

时间:2013-10-31 07:15:21

标签: c memory-management

我无法理解变量大小数组的工作原理,是否在堆栈或其他地方分配了内存,以及如何获取有关其大小的信息。

我尝试了以下代码

#include<stdio.h>

int main()
{
    int n;
    scanf("%d",&n);

    int arr[n];

    printf("%d\n",sizeof(arr));

    return 0;
}

我的意思是我在堆栈上分配内存,然后在运行此函数之前,必须分配堆栈帧并且必须分配局部变量的内存,但是在函数调用scanf()之后,数组的大小是已知的。 / p>

2 个答案:

答案 0 :(得分:2)

在C ++中,虽然有些编译器允许它作为非标准扩展,但尚未允许这样做。动态大小的数组,类似于C中的数组,将在C ++ 14中引入。

如何实现这一点取决于编译器编写器,只要内存分配到某处并自动释放即可。这通常通过在已知大小时扩展堆栈帧来完成。可能会或可能不会检查堆栈是否足够大,因此请注意创建这样的大型数组。

答案 1 :(得分:2)

在大多数具有内存保护功能的现代系统中,您只需增加堆栈即可。如果访问增长的堆栈导致对内存的访问实际上超出了进程的有效虚拟内存范围,操作系统将捕获该内存并以您的方式映射更多内存。

因此“动态”执行此操作没有问题,当然“在堆栈上分配n个字节”通常与“stackpointer - = n”一样复杂。

如果函数有许多退出路径,可能会有一些额外的复杂性,因为它们需要展开适当数量的堆栈,具体取决于是否分配了可变长度数组,不确定通常如何解决。这将是一个简单的代码阅读练习,以找出答案。