如果
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 *
,例如能够访问与类型 unsigned char
本身无关的任何对象。因此,这个问题不是链接的问题的重复。链接的问题也是关于 C++ 的,但我不问关于 C++ 的问题,我的问题是关于 C 的。请不要将此问题标记为链接问题的重复,因为问题绝对不一样。
证明:
标准断言
sizeof(unsigned char)
是 1
。
标准断言没有小数尺寸。
标准不允许
uint8_t
有填充位。
标准不允许
unsigned char
有填充位。
因此:
根据鸽巢原理,一个
unsigned char
中不能有两个 uint_8
。
uint_8
的大小必须为1。
因此定义了通过
unsigned char
传输 uint8_t
或通过 uint8_t
unsigned char
。
但是,您的代码并不完全有效,因为当您将 int 指针转换为指向
unsigned char
的指针时,您采用了字节序依赖关系。在 C 中,指针转换是传递的,除非从函数指针转换到非函数指针,因此我们可以像直接从 int *
转换到 unsigned char *
一样进行分析。*
*这仅适用于演员表。通过 union 或 memcpy 进行位块传输可以克服这一点。