VLA的记忆在gcc下可用

当malloc返回NULL时,有没有办法检测到使用VLA的堆栈上没有足够的内存?

C中没有任何内容可以保证声明VLA或检查内存使用故障是否成功。 对于自动对象VLA的任何声明,这都是相同的。

你可以希望崩溃,但最糟糕的情况是事情似乎会起作用,你最终会写入其他内存。 默认情况下,至少gcc不会生成尝试validation内存是否可用的代码(虽然它有一个选项),因此足够大的VLA可以在任何地方结束。 在MacOS上,您只需要在线程进程中使用0.5MB VLA,以便意外地写入其他线程的堆栈。 Linux上10MB。

如果您不能保证VLA很小(少于一页或两页),请不要使用它。

malloc()检查堆, VLAs工作在增加堆栈大小。 如果malloc()返回NULL那么你的堆栈也被填满了。

正如WhozCraig指出的那样,不要用VLA赌博。 如果数组大小很大 – 使用malloc()