这是一个有效的C语句吗?

时间:2010-12-31 21:33:58

标签: c++ c gcc

假设我在C或C ++中编写char c[99] = {'Stack Overflow'};。它编译好,但这是有效的吗?通过有效,我的意思是不会调用任何未定义或未指定的行为。

再次,如果我写char c[99] = 'Stack Overflow'; gcc抱怨多字符常量很明显但是在上面当我用括号括起来时,编译器很高兴!为什么会这样?

我还注意到puts(c);在第一个语句之后将'w'输出为Stack Overflow的一般字符串的最后一个字符。为什么这样?

有人可以单独解释这些行为吗?

2 个答案:

答案 0 :(得分:14)

它们都只是一个文字,因此c[0]设置为文字,c[1] ... c[98]填充为零(NUL字符)。

我认为实际上填入c[0]的值是依赖于实现的,但它至少应该在任何兼容的编译器上编译。

编辑:根据标准验证,至少在C ++ 0x中验证:

  

多字符文字具有类型int和实现定义的值。

在C99中(使用the draft,因为它是免费的):

  

包含多个字符的整数字符常量的值(例如,   'ab'),或包含不映射到单字节的字符或转义序列   执行角色,是实现定义。

答案 1 :(得分:1)

同意 - 在Windows内核代码中 - 您会看到很多标记内存。它实际上是按平台实现的。但是,它们使用ULONG来标记内存,并且它总是以相反顺序的4个字符的文字: ULONG tagMemory ='kscf';

解释是特定于平台的,但是是一串字符。