0

由于 malloc 返回 NULL,有没有办法使用 VLA 检测堆栈上的内存不足?

4

3 回答 3

2

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

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

于 2013-02-28T10:25:39.607 回答
1

malloc()检查堆,VLAs努力增加堆栈大小。如果malloc()返回NULL机会是你的堆栈也已被填满。

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

于 2013-02-28T09:34:09.560 回答
1

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

于 2013-02-28T09:55:30.973 回答