大小为0的数组

时间:2011-05-30 19:22:39

标签: c++ c arrays gcc

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

的情况下

6.17 Arrays of Length Zero

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

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

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

int s[0]
int s[0][100]
int s[100][0]

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

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

提前致谢!

4 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:3)

我在ideone.com

运行了这个程序
#include <iostream>

int main()
{
    int a[0];
    int b[0][100];
    int c[100][0];

    std::cout << "sizeof(a) = " << sizeof(a) << std::endl;
    std::cout << "sizeof(b) = " << sizeof(b) << std::endl;
    std::cout << "sizeof(c) = " << sizeof(c) << std::endl;

    return 0;
}

它将所有变量的大小设为0。

sizeof(a) = 0
sizeof(b) = 0
sizeof(c) = 0

因此,在上面的示例中,没有为abc分配内存。

答案 2 :(得分:2)

用gcc编译你的例子,所有这三个都有sizeof 0,所以我认为所有这些都被编译器平等对待。

答案 3 :(得分:2)

您的链接解释了一切。当在编译时未知结构的长度时,它们用作结构中的最后一个字段。如果你尝试在堆栈上或在其他声明的中间使用它们,你将最终覆盖下一个元素。