【发布时间】:2014-02-06 13:42:54
【问题描述】:
GCC 如何实现可变长度数组 (VLA)?这样的数组本质上是指向alloca返回的动态分配存储的指针吗?
我能想到的另一种选择是,将这样的数组分配为函数中的最后一个变量,以便在编译时知道变量的偏移量。但是,第二个 VLA 的偏移量将在编译时再次未知。
【问题讨论】:
-
VLA works by placing the array in the stack- stackoverflow.com/questions/2034712/variable-length-arrays。这也是我在使用 VLA 时检查 gcc 生成的程序集输出时看到的,没有调用malloc。但这可能取决于实际的实现。 -
这是一个开源项目。你可以阅读代码。或者,您可以简单地通过检查它省略的代码来解决它。另请注意,完全有可能在不同的平台上有不同的实现。
-
实现使用
malloc来实现VLA 没有任何意义,因为malloc 可能会失败。如果有足够的可用堆栈空间,则可以保证分配 VLA 成功。 malloc 永远不能保证成功。 -
@Brandin:分配可变长度数组或通过
malloc分配都不能保证无限期地工作。在最常见的 C 实现中,使用malloc处理可变长度数组将支持比使用堆栈更大的可变长度数组,因为可用于动态分配的空间远大于默认堆栈大小。 -
@Brandin:除此之外,大多数 C 实现不提供任何关于堆栈空间例程将使用多少的保证,不提供任何帮助来检查编译结果以查看它们有多少使用,并且不支持运行时检查已使用了多少堆栈空间(尽管显然可以将堆栈指针的值与堆栈限制进行比较,前提是已经研究了实现并使用了非标准代码)。因此,没有支持的方法来防止创建可变长度数组的灾难性失败。程序简单地中止。
标签: c arrays assembly gcc variable-length-array