最近在SO上的一个问题涉及“为什么在特定情况下在堆栈上分配大元素不会失败?”以及一系列其他关于“在堆栈上使用大数组”或“堆栈大小限制”的问题,这促使我搜索标准中记录的相关限制。
我知道C标准没有指定“堆栈”,因此它不定义任何与这种堆栈相关的限制。但我想知道在 void foo() { char anArray[SIZE_X]; ... }
中,标准保证程序工作的SIZE_X
是多少,如果程序超出了这个SIZE_X
会发生什么。
我找到了以下定义,但我不确定这个定义实际上是否保证了具有自动存储期的对象的特定支持大小(参见这里在线的C11标准草案):
翻译如下:
最近在 SO 上有一个问题涉及“为什么在特定情况下在堆栈上分配大元素不会失败?”以及一系列其他关于“在堆栈上使用大数组”或“堆栈大小限制”的问题,这促使我搜索标准中记录的相关限制。
我知道 C 标准没有指定“堆栈”,因此它不定义这种堆栈的任何限制。但我想知道标准保证程序能够正常工作的
SIZE_X
在哪个范围内,以及如果程序超出了这个SIZE_X
会发生什么。我找到了以下定义,但我不确定这个定义实际上是否保证了具有自动存储期的对象的特定支持大小(请参阅 此处在线C11标准草案):
5.2.4.1 翻译限制
(1) 实现必须能够翻译和执行至少包含以下每一个限制的一个程序:
...
在主机环境中,一个对象的大小不超过 65535 字节
这是否意味着在类似于
void foo() { char anArray[SIZE_X]; ... }
的函数中,实现必须支持SIZE_X
的值高达65535
,而SIZE_X
大于65535
的任何值都是未定义行为?对于堆,调用返回
NULL
的malloc
允许我控制请求“太大对象”的尝试。但是如果程序“请求具有自动存储期限的过大对象”,特别是如果这样的最大大小未在limits.h
等文件中记录,我如何控制程序的行为?因此,是否可以编写可移植的函数checkLimits()
,支持像以下这样的“入口屏障”:
int main() { if(! checkLimits()) { printf("program execution for sure not supported in this environment."); return 1; } else { printf("might work. wish you good luck!"); } ... }
checkLimits
方法存在一个问题,即在许多情况下,它会受到可用内存量的限制。在有多个程序运行的环境中,当您调用checkLimits
和实际调用foo
之间,其他一些程序可能会分配内存。 - Daniel H