gpt4 book ai didi

c - 在 C11 中,字符串文字为 char[]、unsigned char[]、char* 和 unsigned char*

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:11 28 4
gpt4 key购买 nike

通常字符串文字是 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[]

在第一个示例中,您尝试将 char* 分配给 unsigned char*。这些是不兼容的类型,因此您会收到一条编译器诊断消息。

在第二个示例中,以下内容适用,C11 6.7.9/14:

An array of character type may be initialized by a character string literal or UTF−8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

意味着代码与此相同:

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“简单赋值”适用。

关于c - 在 C11 中,字符串文字为 char[]、unsigned char[]、char* 和 unsigned char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47923662/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com