【发布时间】:2021-01-21 16:34:43
【问题描述】:
如果uint8_t 存在,指向uint8_t 的指针是否等同于指向unsigned char 的指针?意味着它可以用于访问任何对象,并且在访问不同的对象时不会导致UB。我知道这条规则:
int intVar=0;
unsigned char *charPtr=&intVar; //completely valid and does not cause UB
printf("%X ",*charPtr); //this is also valid and does not cause UB
struct SomeStruct_T structVar={};
int *intPtr=&structVar; //This causes UB
但是这个呢:
int intVar=0;
uint8_t *uint8Ptr=&intVar; //Is this valid?
printf("%X ",*uint8Ptr); //If yes, is this also valid?
带有-Wincompatible-pointer-types 的GCC 会发出关于unsigned char *charPtr=&intVar; 和uint8_t *uint8Ptr=&intVar; 的警告,但使用演员表时,此警告就会消失。这没有回答问题。
uint8_t * 可能与unsigned char * 不同的系统可能没有,但标准是怎么说的?
这个问题是关于指向unsigned char 或uint8_t 的指针类型,而不是关于数据类型unsigned char 或uint8_t 本身。 unsigned char * 的一些基本属性可能适用于uint8_t *,也可能不适用于uint8_t *,例如能够访问任何与unsigned char 类型本身无关的对象。因此,这个问题不是链接的question 的重复。链接的问题也是关于C++的,但我不问C++,我的问题是关于C的。请不要将此问题标记为链接问题的重复,因为问题肯定不一样。
【问题讨论】:
-
我认为
int *intPtr=&structVar; //This causes UB只要你不取消引用它就可以(不是UB)(我需要挖掘标准才能确定)。 -
@underscore_d 链接的问题是关于数据类型,而不是指针类型。
-
@underscore_d 请在标记重复之前阅读这两个问题,谢谢。另一个问题是关于
uint8_tvsunsigned char而不是uint8_t *vsunsigned char *和链接的问题是关于 C++ 这个问题是关于 C 的。 -
我可以正常阅读,谢谢。 C++ 只是从 C 继承这些类型,指针的行为/有效性基于它们指向的类型,所以这对我来说似乎是一个明显的骗局。显然,另一个投票关闭重复的用户也同意了,所以我不能是唯一的。
标签: c pointers language-lawyer