如果uint8_t存在,uint8_t* 是否等价于unsigned char*?[副本]

igetnqfo  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(233)

此问题已在此处有答案

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 charuint8_t的指针类型,而不是关于数据类型unsigned charuint8_t本身。unsigned char *的一些基本属性可能适用于uint8_t *,也可能不适用于uint8_t *,例如能够访问任何对象,这些属性与unsigned char类型本身无关。因此,这个问题不是链接question的重复。这个链接的问题也是关于C的,但我不是问C,我的问题是关于C的。请不要将此问题标记为与链接问题重复,因为问题肯定不相同。

ctehm74n

ctehm74n1#

证明:
标准Assertsizeof(unsigned char)1
该标准声称没有分数大小。
标准不允许uint8_t有填充位。
标准不允许unsigned char有填充位。
因此:
根据鸽子洞原理,一个uint_8中不能有两个unsigned char
uint_8的大小必须为1。
因此,定义了从unsigned charuint8_t或从uint8_tunsigned char的位块传输。
但是,您的代码并不完全有效,因为当您将int指针转换为unsigned char指针时,您采用了一个端序依赖项。在C语言中,指针转换是可传递的,除非是从函数指针转换到非函数指针,所以我们可以分析为直接从int *转换到unsigned char *

  • 这只适用于铸件。通过工会或memcpy的 lightning 战可以无视这一点。

相关问题