假设我在C或C ++中编写char c[99] = {'Stack Overflow'};
。它编译好,但这是有效的吗?通过有效,我的意思是不会调用任何未定义或未指定的行为。
再次,如果我写char c[99] = 'Stack Overflow';
gcc抱怨多字符常量很明显但是在上面当我用括号括起来时,编译器很高兴!为什么会这样?
我还注意到puts(c);
在第一个语句之后将'w'输出为Stack Overflow
的一般字符串的最后一个字符。为什么这样?
有人可以单独解释这些行为吗?
答案 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';
解释是特定于平台的,但是是一串字符。