2

我对 C 规范(主要是 C99)的最大努力使我认为void *在以下任何类型之间进行强制转换(或隐式转换,其中隐式转换行为适用)是有效的:

void *, char *, signed char *,unsigned char *

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

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

它是否正确?void *是否存在任何不正确的 C 标准版本(预标准化 C 中缺少类型)?

PS我相信这个问题是在许多其他问题中零碎回答的,但我从未见过一个明确的答案,明确说明/确认。

4

1 回答 1

1

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

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

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

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

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

于 2016-02-01T02:41:46.243 回答