我们可以在 C 中声明多少局部变量有限制吗?

Is there a limit on how many local variables we can declare in C?

考虑到 C 函数中的局部变量在调用函数后会被压入堆栈(压入传递给函数的变量之后),在堆栈缓冲区溢出?或者该限制仅由确定的主机具有的 RAM 量给出?

我试图通过创建一个 4.6gb .C 文件来测试它,其中包含一个函数,该函数声明了 25000*13 个变量并将其初始化为 0。在 main() 中调用了该函数,但它只编译了很好(使用 -O0)并且没有崩溃。

主线程的默认堆栈大小在 macOS 上为 8 MiB(来自 ld 手册页),在 Linux 上为 2 MiB(根据 --stack 开关 here), and 1 MiB on Windows (per this page).在程序中创建的其他线程可能具有较小的堆栈。 (注意:引用的各种来源使用“MB”或“Mb”;我在上下文中将这些解释为 1,048,576 字节 = 1 MiB。)

将程序链接到可执行文件时,可以请求不同的堆栈大小。

函数使用堆栈 space 做各种事情,包括传递参数、建立用于抛出异常的堆栈帧、有时调试信息和临时工作 space,因此它们之间没有直接关联用于堆栈的内存量和可以定义的变量数。

例如根据 C 标准(5.2.4.1 翻译限制)

1 The implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following limits:

— 4095 external identifiers in one translation unit

— 511 identifiers with block scope declared in one block

既然你不问最低要求我就写C标准

现在的现代兼容编译器不设置任何限制(Microsoft 不计算在内,因为它不兼容)。您受到可用计算机资源的限制。

工具链的另一部分(链接器、目标文件和可执行文件限制等)可能会有一些额外的限制,但现代主线编译器通常没有任何限制。