为什么我不能初始化一个可变大小的数组?

Loc*_*ead 9 c++ arrays initialization

只要变量是const,初始化可变大小的数组时GCC不会出错,但是当它不是时,它就不会编译.

这背后的原因是什么?这样做有什么不妥:

int size = 7;
int test[size] = {3, 4, 5};
Run Code Online (Sandbox Code Playgroud)

根本不会编译,但如果我不初始化test []那么它会编译!这对我来说没有任何意义,因为据我所知,无论什么(这意味着我使用的整数文字都不是真的),需要根据它的大小(7个整数)来使堆栈框架适合这个数组.如果我没有弄错的话,有任何意义,那么如果我初始化它会有什么不同?

只是我疯狂的C++设计问题中的另一个......

谢谢!

Arm*_*yan 9

  • 数组的大小必须是常量整数表达式.
  • 积分文字是一个常数积分表达式.(int arr[5];)
  • 用常量表达式初始化的常量积分变量是常量表达式.(const int j = 4; const int i = j; int a[i];)

  • 使用非常量表达式初始化的常量变量不是常量表达式

     int x = 4;  // x isn't constant expression because it is not const
     const int y = x; //therefore y is not either
     int arr[y]; //error)
    
    Run Code Online (Sandbox Code Playgroud)

  • @MisterSir:你忘了指定`-pedantic`.没有它,gcc不会也不会尝试成为符合标准的C++实现.你不能断定只是因为gcc接受某些东西,它必须是语法上正确的C++. (4认同)

Ste*_*sop 5

实际上,这更像是一个疯狂的C99设计问题,因为可变长度数组是C99的一项功能,gcc允许C ++作为扩展。

在C99中,6.7.8 / 3表示“要初始化的实体的类型...不是可变长度数组类型”,因此gcc对其扩展使用的规则与C99所要求的相同。

C99基本原理文档未说明为何无法初始化VLA。我可以推测,如果为大小提供的值小于初始化器,则可能是由于初始化器中元素过多的风险。但是我不知道。