了解C中的数组声明

时间:2018-11-17 08:58:09

标签: c arrays declaration

我试图了解C标准如何解释声明可能导致错误。考虑以下非常简单的代码:

int main()
{
    char test[1024 * 1024 * 1024];
    test[0] = 0;
    return 0;
}

Demo

此segfaluts。但是以下代码没有:

int main()
{
    char test[1024 * 1024 * 1024];
    return 0;
}

Demo

但是当我在我的机器上编译它时,最新的也出现了段错误。主要功能为

00000000000008c6 <main>:                        
 8c6:   55                      push   %rbp                            
 8c7:   48 89 e5                mov    %rsp,%rbp                                         
 8ca:   48 81 ec 20 00 00 40    sub    $0x40000020,%rsp        
 8d1:   89 bd ec ff ff bf       mov    %edi,-0x40000014(%rbp) // <---HERE    
 8d7:   48 89 b5 e0 ff ff bf    mov    %rsi,-0x40000020(%rbp)                      
 8de:   64 48 8b 04 25 28 00    mov    %fs:0x28,%rax
 8e5:   00 00                       
 8e7:   48 89 45 f8             mov    %rax,-0x8(%rbp)
 8eb:   31 c0                   xor    %eax,%eax
 8ed:   b8 00 00 00 00          mov    $0x0,%eax       
 8f2:   48 8b 55 f8             mov    -0x8(%rbp),%rdx
 8f6:   64 48 33 14 25 28 00    xor    %fs:0x28,%rdx
 8fd:   00 00                              
 8ff:   74 05                   je     906 <main+0x40>
 901:   e8 1a fe ff ff          callq  720 <__stack_chk_fail@plt>
 906:   c9                      leaveq
 907:   c3                      retq
 908:   0f 1f 84 00 00 00 00    nopl   0x0(%rax,%rax,1)
 90f:   00

据我了解,尝试mov %edi,-0x40000014(%rbp)时发生段错误。

我试图在N1570Section 6.7.9 Initialization中找到全贴,但似乎与之无关。

那么标准如何解释这种行为?

1 个答案:

答案 0 :(得分:3)

结果取决于实现

我可以想到行为为何不同的几个原因

  • 编译器发现未使用该变量,没有可能的副作用,并对其进行了优化(即使没有优化级别)
  • 堆栈可根据要求调整大小。由于尚未对此变量进行写操作,为什么现在要调整堆栈大小?
  • 编译器不必将堆栈用于自动存储。编译器可以使用malloc分配内存,并在退出时释放它。使用堆将允许毫无问题地分配1Gb
  • 堆栈大小设置为1Gb:)