是"太大"具有自动存储持续时间未定义行为的对象?

时间:2017-11-09 21:35:04

标签: c language-lawyer

关于SO的recent question"为什么在这种特定情况下在堆栈上分配大元素不会失败?"以及关于"堆栈上大型数组的一系列其他问题"或"堆栈大小限制"让我搜索标准中记录的相关限制。

我知道C标准没有指定"堆栈"因此它没有为这种堆栈定义任何限制。但是我想知道SIZE_X void foo() { char anArray[SIZE_X]; ... }标准中的SIZE_X是否可以保证程序正常运行,以及如果某个程序超出此65535会发生什么。

我找到了以下定义,但我不确定这个定义是否实际上是对具有自动存储持续时间的特定支持对象大小的保证(参见this在线C11标准草案):< / p>

  

5.2.4.1翻译限制

     

(1)实施应至少能够翻译和执行   一个程序,其中至少包含一个实例   以下限制:

     

...

     

对象中的65535个字节(仅限托管环境中)

这是否意味着实施必须在SIZE_X等函数中支持void foo() { char anArray[SIZE_X]; ... } 65535的值,并且SIZE_X的值大于malloc是未定义的行为?

对于堆,调用NULL返回limits.h让我控制请求&#34;太大的对象&#34;的尝试。但是,如果程序请求具有自动存储持续时间的过大对象,我该如何控制程序的行为,特别是如果没有记录这样的最大尺寸,例如,在一些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!"); } ... } 支持&#34;进入障碍&#34;像:

#include <MsgBoxConstants.au3>

Example()

Func Example()
    ; Run Notepad
    Run("notepad.exe")

    ; Wait 10 seconds for the Notepad window to appear.
    Local $hWnd = WinWait("[CLASS:Notepad]", "", 10)

    ; Set the edit control in Notepad with some text. The handle returned by WinWait is used for the "title" parameter of ControlSetText.
    ControlSetText($hWnd, "", "Edit1", "This is some text")

    ; Retrieve the text of the edit control in Notepad. The handle returned by WinWait is used for the "title" parameter of ControlGetText.
    Local $sText = ControlGetText($hWnd, "", "Edit1")

    ; Display the text of the edit control.
    MsgBox($MB_SYSTEMMODAL, "", "The text in Edit1 is: " & $sText)

    ; Close the Notepad window using the handle returned by WinWait.
    WinClose($hWnd)
EndFunc   ;==>Example

1 个答案:

答案 0 :(得分:5)

从技术上讲,实现只需要使用65,535字节对象(以及列出的其他内容)来转换和执行一个程序,以符合标准。它可能会对所有其他人失败。

要了解更大的程序是否有效,您必须依赖具体实施的详细信息。大多数实现提供的堆栈空间多于64 KiB,尽管它可能没有文档记录。可能有链接器开关用于调整允许的堆栈空间。

,对于当前macOS上的ld链接器,默认值为8 MiB,-stack_size开关可用于设置更多或更少(对于主线程)。

我想说,因为C标准说堆栈空间等环境限制可能会限制实现,除了一个特定的示例程序必须工作之外的任何事情都是技术上未定义的行为。