【发布时间】:2014-02-27 22:25:59
【问题描述】:
我试图在堆栈中创建大量内存 (int a[1000000000])。它编译成功。但是在运行时它发生了Segfaulted。程序段错误是完全可以接受的。我的问题是,为什么编译器不能事先检测到并抛出编译错误?为什么要等到程序运行?
另外,当我分配int a[100] 时,asm 代码如下所示。
00000000004004b4 <main>:
4004b4: 55 push %rbp
4004b5: 48 89 e5 mov %rsp,%rbp
4004b8: 48 81 ec 18 01 00 00 sub $0x118,%rsp (memory created for 100 bytes)
如果我为大内存创建int a[1000000000],asm 代码看起来不同。
00000000004004b4 <main>:
4004b4: 55 push %rbp
4004b5: 48 89 e5 mov %rsp,%rbp
4004b8: 49 bb 78 00 17 be 33 movabs $0xfffe9433be170078,%r11
4004bf: 94 fe ff
4004c2: 4c 01 dc add %r11,%rsp
有人可以解释一下吗?即为什么编译器不处理这个?
谢谢
孩子
【问题讨论】:
-
编译器应该如何知道目标的内存量?
-
我相信你刚刚超越了 Stack Segment。
-
编译器如何知道运行时有多少堆栈空间可用?
-
如果您有两个问题,那么请发布两个问题。不要发布一个有两个问题的问题;第二个问题很可能被忽略。如果不是,则很难选择哪个是公认的答案,是否应该在单独的答案中回答这两个问题。
标签: c gcc compiler-construction