我尽最大努力阅读C规范(主要是C99)让我认为在任何这些类型之间转换(或隐式转换,其中void *
的隐式转换行为适用)是有效的:
void *
,char *
,signed char *
,unsigned char *
我希望这不会触发任何未定义的行为,并保证这些指针具有相同的底层表示。
因此,应该可以获取指向可以合法解除引用,类型转换和/或将其分配给三个char类型指针之一的地址的四种类型中的任何一种的指针,并取消引用它可以访问相同的内存,唯一的区别在于您的代码是否会将该位置的数据视为char
,signed char
或unsigned char
。
这是对的吗?是否存在C标准的任何版本(预标准化C中缺少void *
类型),这不是真的吗?
P.S。我相信这个问题在传递许多其他问题时会得到零碎的回答,但我从未见过明确陈述/确认的明确答案。
答案 0 :(得分:1)
因此,应该可以获取指向可以合法解除引用,类型转换和/或将其分配给三个char类型指针之一的地址的四种类型中的任何一种的指针,并取消引用它访问相同的内存,唯一的区别是你的代码是否将该位置的数据视为char,signed char或unsigned char。
这是对的。实际上,您可以获取一个指向任何类型对象的有效指针,并将其转换为其中一些并访问内存。
您正确地提到了关于void *
和char *
等具有相同表示和对齐要求的规定,但这实际上并不重要。这指的是指针本身的属性,而不是指向的对象的属性。
不违反严格别名规则,因为它包含一个明确的规定,即字符类型可用于读取或写入任何对象。
请注意,如果我们有signed char ch = -2;
或任何其他负值,则(unsigned char)ch
可能与*(unsigned char *)&ch
不同。在具有8位字符的系统上,前者保证为254
,但后者可以是254
,253
或130
,具体取决于使用的编号系统