C 保证回复:指向 Void 和字符类型的指针,类型转换
C Guarantees Re: Pointers to Void and Character Types, Typecasting
我对 C 规范(主要是 C99)的最大努力使我认为在任何这些类型:
void *
、char *
、signed char *
、unsigned char *
我希望这不会触发未定义的行为,并且保证那些指针具有相同的底层表示。
因此,应该可以采用这四种类型之一的指针,该指针已经指向可以合法取消引用的地址,类型转换 and/or 将其分配给三种 char 类型之一指针,并取消引用它以访问相同的内存,唯一的区别是您的代码是否将该位置的数据视为 char
、signed char
或 unsigned char
.
这是正确的吗?是否有任何版本的 C 标准(在预标准化 C 中缺少 void *
类型无法承受)哪里不是这样?
P.S。我相信这个问题在传递许多其他问题时得到了零碎的回答,但我从来没有看到一个明确的答案明确 stated/confirmed.
Consequently, it should be possible to take a pointer of either one of those four types that is already pointing to an address which can be legally dereferenced, typecast and/or assign it to one of the three char type pointers, and dereference it to access the same memory, with the only difference being whether your code will treat the data at that location as a char, signed char, or unsigned char.
这是正确的。事实上,您可以获取指向 any 类型对象的有效指针,并将其转换为这三种类型中的一些并访问内存。
您正确地提到了有关 void *
和 char *
等具有相同表示和对齐要求的规定,但这实际上无关紧要。那指的是指针本身的属性,而不是被指向的对象的属性。
没有违反严格的别名规则,因为它包含一个字符类型可用于读取或写入任何对象的明确规定。
请注意,如果我们有例如 signed char ch = -2;
或任何其他负值,则 (unsigned char)ch
可能不同于 *(unsigned char *)&ch
。在具有 8 位字符的系统上,前者保证为 254
,但后者可能是 254
、253
或 130
,具体取决于所使用的编号系统.
我对 C 规范(主要是 C99)的最大努力使我认为在任何这些类型:
void *
、char *
、signed char *
、unsigned char *
我希望这不会触发未定义的行为,并且保证那些指针具有相同的底层表示。
因此,应该可以采用这四种类型之一的指针,该指针已经指向可以合法取消引用的地址,类型转换 and/or 将其分配给三种 char 类型之一指针,并取消引用它以访问相同的内存,唯一的区别是您的代码是否将该位置的数据视为 char
、signed char
或 unsigned char
.
这是正确的吗?是否有任何版本的 C 标准(在预标准化 C 中缺少 void *
类型无法承受)哪里不是这样?
P.S。我相信这个问题在传递许多其他问题时得到了零碎的回答,但我从来没有看到一个明确的答案明确 stated/confirmed.
Consequently, it should be possible to take a pointer of either one of those four types that is already pointing to an address which can be legally dereferenced, typecast and/or assign it to one of the three char type pointers, and dereference it to access the same memory, with the only difference being whether your code will treat the data at that location as a char, signed char, or unsigned char.
这是正确的。事实上,您可以获取指向 any 类型对象的有效指针,并将其转换为这三种类型中的一些并访问内存。
您正确地提到了有关 void *
和 char *
等具有相同表示和对齐要求的规定,但这实际上无关紧要。那指的是指针本身的属性,而不是被指向的对象的属性。
没有违反严格的别名规则,因为它包含一个字符类型可用于读取或写入任何对象的明确规定。
请注意,如果我们有例如 signed char ch = -2;
或任何其他负值,则 (unsigned char)ch
可能不同于 *(unsigned char *)&ch
。在具有 8 位字符的系统上,前者保证为 254
,但后者可能是 254
、253
或 130
,具体取决于所使用的编号系统.