【发布时间】:2017-05-17 10:53:09
【问题描述】:
我为嵌入式系统编程。一条黄金法则是我们从不致电malloc();所有数据必须在编译时静态分配。
因此,我对 Variable Length Arrays 不是很熟悉,它是在 C99 中引入的。
这个概念似乎很清楚,我不需要它解释。我的问题是,如果这样的数组没有足够的可用内存,在运行时会发生什么?
我想它依赖于 o/s,也许依赖于编译器,GCC/Linux 会做什么,以及 Windows 上的 MS Visual Studio C?任何 X99 或 Posix 定义?
【问题讨论】:
-
Mawg 我想你已经回答了你自己的问题。这将导致未定义的行为,因此您需要查看您开发的给定平台如何处理此问题。我猜你必须在调用使用 VLA 的函数之前尝试捕获它。我猜想如果要避免 malloc,VLA 也应该避免。
-
适用与任何堆栈溢出相同的规则,可能会在较小的嵌入式 MCU 上无法控制地崩溃,并在较大的设备(包括 Linux/Windows)上通过内存保护进行捕获。更重要的是堆栈分配也是动态分配,因此在 C 中无法真正避免。如果您避免使用函数指针/ recursion/VLA/alloca(或者可能提供合适的手动提示,比如可能的函数指针目标列表)。
-
doynax,我在这里可能是错的,但在许多平台/环境中,堆栈在编译时每个进程都是固定的。例如,在 windows 上很容易用完堆栈(但这并不意味着它不是动态的,只是上限是静态的),但是说你可以通过启动一个新线程来解决这个问题任意堆栈空间。
-
@cdcdcd:是的,但仅限于可用内存。问题涉及嵌入式设备,因此这个空间可能相当有限,更糟糕的是,根据特定平台,可能会完全不受检查。通常要求是此类系统(您的烤面包机或其他任何东西)设计为永远不会耗尽内存,在这种情况下必须小心处理堆栈分配。名义上,相同的规则也适用于 Windows/Linux,但由于操作系统本身缺乏任何此类分配保证,因此您必须满足于尽力而为的解决方案。
-
VLA 通常(取决于编译器)从堆栈分配内存,类似于 alloca() 或 _alloca(),在这种情况下没有堆或 malloc() 不是问题。在嵌入式系统上,堆栈空间(每个线程)可能非常有限。
标签: c c99 variable-length-array