这个问题与C99 中的可变长度数组有关但不同于这个问题。
答案指出,在堆栈中分配可变长度数组(或仅是固定大小的大数组)的一个危险是分配可能会默默地失败,而不是调用malloc
,它明确告诉调用者分配是否成功。
现代非嵌入式编译平台使用无效内存区域来检测一些堆栈溢出,无需额外费用(检查只是 MMU 已经免费进行的检查)。这并不能 100% 避免上述问题,因为非常大的本地数组可能会导致堆栈指针跳过无效区域。
有谁知道通常为此检测分配多少页?我猜它至少是 4KiB,但可能更多。这是编译器还是操作系统做出的选择,无论哪种情况,有没有办法改变它?