C保证Re:指向无效和字符类型的指针,Typecasting

时间:2015-09-15 05:30:47

标签: c casting language-lawyer void-pointers char-pointer

我尽最大努力阅读C规范(主要是C99)让我认为在任何这些类型之间转换(或隐式转换,其中void *的隐式转换行为适用)是有效的:

void *char *signed char *unsigned char *

我希望这不会触发任何未定义的行为,并保证这些指针具有相同的底层表示。

因此,应该可以获取指向可以合法解除引用,类型转换和/或将其分配给三个char类型指针之一的地址的四种类型中的任何一种的指针,并取消引用它可以访问相同的内存,唯一的区别在于您的代码是否会将该位置的数据视为charsigned charunsigned char

这是对的吗?是否存在C标准的任何版本(预标准化C中缺少void *类型),这不是真的吗?

P.S。我相信这个问题在传递许多其他问题时会得到零碎的回答,但我从未见过明确陈述/确认的明确答案。

1 个答案:

答案 0 :(得分:1)

  

因此,应该可以获取指向可以合法解除引用,类型转换和/或将其分配给三个char类型指针之一的地址的四种类型中的任何一种的指针,并取消引用它访问相同的内存,唯一的区别是你的代码是否将该位置的数据视为char,signed char或unsigned char。

这是对的。实际上,您可以获取一个指向任何类型对象的有效指针,并将其转换为其中一些并访问内存。

您正确地提到了关于void *char *等具有相同表示和对齐要求的规定,但这实际上并不重要。这指的是指针本身的属性,而不是指向的对象的属性。

不违反严格别名规则,因为它包含一个明确的规定,即字符类型可用于读取或写入任何对象。

请注意,如果我们有signed char ch = -2;或任何其他负值,则(unsigned char)ch可能与*(unsigned char *)&ch不同。在具有8位字符的系统上,前者保证为254,但后者可以是254253130,具体取决于使用的编号系统