【发布时间】:2016-01-06 08:16:12
【问题描述】:
从我们的嵌入式系统代码中删除所有对 malloc 和 calloc 的调用后,我惊讶地发现 malloc 仍在链接中。调用图将我指向一个没有显式 *alloc 调用的函数,并且不调用任何可能分配的库函数,例如strdup。
我必须查看生成的程序集才能意识到这是由于包含 VLA 的内联函数造成的。
我认为 VLA 必须是堆栈分配的。这个编译器坏了吗?
【问题讨论】:
-
与程序的堆栈大小相比,分配的 VLA 有多大?
-
在这种情况下,大小参数是
uint8_t,所以最坏的情况是 256 字节,大约是堆栈的 1/5。 -
如果没有堆栈溢出的机会(我的意思是真正的 :-),为什么不使用最坏的情况,即一些
char arr[256]而不是 VLA? -
我确实把它改成了固定的。问题的重点是揭穿commonassumptionthat VLAs arealways stack。
标签: c heap-memory variable-length-array