大小为0的数组

zw3*_*324 32 c c++ arrays gcc

今天我偶然定义了一个二维数组,其中一维的大小为0,但是我的编译器没有抱怨.我发现以下内容表明这是合法的,至少在gcc的情况下:

6.17长度零的数组

但是,我对这个用法有两个问题:

首先,这被认为是良好的编程习惯吗?如果是这样,那么我们何时应该在现实世界中使用它?

其次,我定义的数组是二维的,一维的0大小.这和一维情况一样吗?例如,

int s[0]
int s[0][100]
int s[100][0]
Run Code Online (Sandbox Code Playgroud)

它们在内存和编译器中都是一样的吗?

编辑:回复Greg:我使用的编译器是gcc 4.4.5.我对这个问题的意图不依赖于编译器,但是如果有任何编译器特定的怪癖也会有用:)

提前致谢!

CB *_*ley 30

在C++中,声明一个零长度的数组是非法的.因此,当您将代码绑定到特定的编译器扩展时,它通常不被认为是一种好的做法.动态大小的数组的许多用法最好用容器类替换,例如std::vector.

ISO/IEC 14882:2003 8.3.4/1:

如果存在常量表达式(5.19),则它应为整数常量表达式,其值应大于零.

但是,您可以使用动态分配零长度的数组new[].

ISO/IEC 14882:2003 5.3.4/6:

direct-new-declarator中的表达式应具有带有非负值的积分或枚举类型(3.9.1).

  • @Krishna_Oza你可以这样做:`int*x = new int [0];`它将返回一个指针,但是取消引用它是未定义的,因为没有可能的理由这样做.编译器可以取消引用它做任何事情,包括崩溃你的程序. (2认同)