我到处看。
堆栈有8MB,这就是为什么您应该使用指针在堆中存储内容。
在我的机器上,下面的代码使用11兆字节的字符,而不是12 my。
我的char c[Nc] 数组存储在所谓的堆中。
#include <stdio.h>
int main()
{
int Nc = 1024*1024; // megabyte
Nc = Nc * 11; // works
//Nc = Nc * 12; // Segmentation fault (core dumped)
char c[Nc];
c[0] = 'A';
c[Nc-1] = 'Z';
printf("%dmb\n", Nc/1024/1024);
printf("%c-%c\n", c[0], c[Nc-1]);
return 0;
}有什么解释吗?
我只是“用户”,而不是程序员。
发布于 2019-08-22 20:03:11
看起来您正在编译您的程序,至少有一些优化。当我在GCC或Clang上编译您的代码时,除了-O0之外,编译器将优化char数组的创建。(螺栓连接)
如果您用-fsanitize=undefined编译您的程序,它会将其捕获为未定义的行为。
在堆栈上放置这么大的数组通常被认为是不好的做法。应该静态地在堆上分配或分配大型对象。操作系统将其默认堆栈分配设置为大多数程序无需担心的级别,这不是保证。作为程序员,你有责任确保你的程序有足够的堆栈空间来运行。如果需要获取或检查堆栈空间的大小,可以使用getrlimit()和setrlimit()。有关详细信息,请参阅man getrlimit。
https://stackoverflow.com/questions/57614757
复制相似问题