1

我无法理解可变大小数组的工作原理,它的内存是分配在堆栈上还是其他地方,以及如何获得有关其大小的信息。

我尝试了以下代码

#include<stdio.h>

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

    int arr[n];

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

    return 0;
}

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

4

2 回答 2

2

在 C++ 中,这不是(还)允许的,尽管一些编译器允许它作为非标准扩展。动态大小的数组,类似于 C 中的数组,将在 C++14 中引入。

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

于 2013-10-31T07:18:26.187 回答
2

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

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

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

于 2013-10-31T07:38:49.963 回答