此问题已在此处有答案:
When is uint8_t ≠ unsigned char?(3个答案)
两年前关门了。
如果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的。请不要将此问题标记为与链接问题重复,因为问题肯定不相同。
1条答案
按热度按时间ctehm74n1#
证明:
标准Assert
sizeof(unsigned char)
是1
。该标准声称没有分数大小。
标准不允许
uint8_t
有填充位。标准不允许
unsigned char
有填充位。因此:
根据鸽子洞原理,一个
uint_8
中不能有两个unsigned char
。uint_8
的大小必须为1。因此,定义了从
unsigned char
到uint8_t
或从uint8_t
到unsigned char
的位块传输。但是,您的代码并不完全有效,因为当您将int指针转换为
unsigned char
指针时,您采用了一个端序依赖项。在C语言中,指针转换是可传递的,除非是从函数指针转换到非函数指针,所以我们可以分析为直接从int *
转换到unsigned char *
。