首页 > 解决方案 > 如果 uint8_t 存在,uint8_t* 是否等同于 unsigned char*?

问题描述

如果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?

GCC对and-Wincompatible-pointer-types发出警告,但使用强制转换此警告会消失。这没有回答问题。可能没有任何系统会有所不同,但标准是怎么说的?unsigned char *charPtr=&intVar;uint8_t *uint8Ptr=&intVar;uint8_t *unsigned char *

这个问题是关于指向unsigned charor的指针类型uint8_t,而不是关于数据类型unsigned charuint8_t本身。有一些基本属性可能适用于,unsigned char *也可能不适用于uint8_t *,例如能够访问任何与类型unsigned char本身无关的对象。因此,这个问题不是链接问题的重复。链接的问题也是关于C++的,但我不问C++,我的问题是关于C的。请不要将此问题标记为链接问题的重复,因为问题肯定不一样。

标签: cpointerslanguage-lawyer

解决方案


证明:

该标准断言sizeof(unsigned char)1

该标准断言没有分数大小。

该标准不允许uint8_t有填充位。

该标准不允许unsigned char有填充位。

所以:

归类原则中不能有两个unsigned chars 。uint_8

的大小uint_8必须为 1。

因此定义了blitting unsigned charthroughuint8_tuint8_tthrough unsigned char

但是,您的代码并不完全有效,因为当您将指向 int 的指针转换为指向unsigned char. 在 C 中,指针转换是可传递的,除非将函数指针转换为非函数指针或从函数指针转换为非函数指针,因此我们可以像直接从int *unsigned char *.*一样进行分析

*这仅适用于演员表。通过 union 或 memcpy 进行 Blitting 可以解决这个问题。


推荐阅读