在以下代码中,const int不能用作数组大小:
const int sz = 0;
typedef struct
{
char s[sz];
} st;
int main()
{
st obj;
strcpy(obj.s, "hello world");
printf("%s", obj.s);
return 0;
}
答案 0 :(得分:12)
在C中,const
- 限定变量不是常量表达式 1 。常量表达式可以在编译时进行评估 - 像10
或3.14159
这样的数字文字,像"Hello"
这样的字符串文字,sizeof
表达式或某个表达式由10 + sizeof "Hello"
组成。
对于文件范围(任何函数体外)的数组声明或struct
或union
类型的成员,数组维必须是常量表达式。
对于auto
数组(在函数体内声明的数组不是static
),可以使用其值不知道的变量或表达式运行时,但仅限C99或更高版本。
<小时/>
const
- 限定变量 计为常量表达式。
答案 1 :(得分:12)
这是因为在C const
实际上意味着只读。引用C FAQ 1.18 and 1.19:
const限定符实际上意味着“只读”&#39;&#39;一个如此限定的对象是一个不能(通常)分配给它的运行时对象。因此,const限定对象的值在术语的完整意义上不是常量表达式,并且不能用于数组维度,案例标签等。 (在这方面,C与C ++不同。)当需要真正的编译时常量时,请使用预处理器#define(或者枚举)。
参考文献:ISO Sec。 6.4 H&amp; S Secs。 7.11.2,7.11.3 pp.226-7
有两种方法可以处理它:
#define
代替const
enum { sz = 12 };
答案 2 :(得分:3)
以一种非常简单的方式,因为编译器必须在编译时知道数组的维度,并且因为您可以在运行时初始化const variable
,所以不能这样做。因此,静态声明的数组的大小必须是常量表达式,而const variable
不是它。对于常量表达式,您应该使用宏(#define
)或enum
。这明确适用于您的情况(在文件范围内),如果您使用最低标准c99
。