通常字符串文字是 const char[] 的类型。但是当我把它当作其他类型时,我得到了奇怪的结果。
unsigned char *a = "\355\1\23";
有了这个编译器抛出警告说“初始化中的指针目标的符号不同”,这是非常合理的,因为可以丢弃符号信息。
但是随着以下
unsigned char b[] = "\355\1\23";
根本没有警告。我认为应该出于上述相同的原因发出警告。这怎么可能?
仅供参考,我使用 GCC 版本 4.8.4。
C 中字符串文字的类型是char[]
,它衰减到char*
。请注意,C 与 C++ 不同,它们的类型为const char[]
。
在第一个示例中,您尝试将 a 分配char*
给unsigned char*
。这些不是兼容的类型,因此您会收到编译器诊断消息。
在第二个示例中,以下内容适用,C11 6.7.9/14:
字符类型的数组可以由字符串文字或 UTF-8 字符串文字初始化,可选地用大括号括起来。字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。
这意味着代码与此相同:
unsigned char b[] =
{
'\355',
'\1',
'\23',
'\0'
};
这也可能会产生警告,但它是有效的代码。当涉及不同整数类型之间的赋值1时,C 具有松散的类型安全性,但在指针类型之间的赋值时要严格得多。
出于同样的原因,我们可以编写unsigned int x=1;
而不是unsigned int x=1u;
.
作为旁注,我不知道您希望使用值为 355 的八进制转义序列实现什么目的。也许您打算写"\35" "5\1\23"
?
1初始化的类型规则与赋值相同。6.5.16.1 “简单分配”适用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句