今天我偶然定义了一个二维数组,其中一维的大小为0,但是我的编译器没有抱怨。我发现以下内容表明这是合法的,至少在gcc:
的情况下但是,我对此用法有两个问题:
首先,这被视为良好的编程习惯吗?如果是这样,那么我们什么时候应该在现实世界中使用它?
其次,我定义的数组是二维的,一维的0大小。这和一维情况一样吗?例如,
int s[0]
int s[0][100]
int s[100][0]
它们在内存和编译器中都是一样的吗?
编辑:回复Greg:我使用的编译器是gcc 4.4.5。我对这个问题的意图不依赖于编译器,但是如果有任何编译器特定的怪癖也会有用:)
提前致谢!
答案 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)
#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
因此,在上面的示例中,没有为a
,b
或c
分配内存。
答案 2 :(得分:2)
用gcc编译你的例子,所有这三个都有sizeof
0,所以我认为所有这些都被编译器平等对待。
答案 3 :(得分:2)
您的链接解释了一切。当在编译时未知结构的长度时,它们用作结构中的最后一个字段。如果你尝试在堆栈上或在其他声明的中间使用它们,你将最终覆盖下一个元素。