c - 如果 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 char
or的指针类型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
s 。uint_8
的大小uint_8
必须为 1。
因此定义了blitting unsigned char
throughuint8_t
或uint8_t
through unsigned char
。
但是,您的代码并不完全有效,因为当您将指向 int 的指针转换为指向unsigned char
. 在 C 中,指针转换是可传递的,除非将函数指针转换为非函数指针或从函数指针转换为非函数指针,因此我们可以像直接从int *
到unsigned char *
.*一样进行分析
*这仅适用于演员表。通过 union 或 memcpy 进行 Blitting 可以解决这个问题。
推荐阅读
- python-3.x - 无法使用 BeautifulSoup 抓取 HTML 表格并使用 Python 将其加载到 Pandas 数据框中
- python - 有人可以告诉我我的动画代码有什么问题吗?
- c++ - 多源 BFS 多线程
- java - CMS GC 很长的停顿
- php - 如何删除“.php”扩展名并在 URL 末尾添加“/”?
- stenciljs - StencilJS Navigates pages not rendering correctly in navigated page
- python - 允许 python 对象与数学运算符交互
- ios - Swift-Watch:如何检测用户滚动到 WKInterfaceTable 中的最后一行
- javafx - 如何绑定 ObjectBinding
到带有格式化程序的标签? - typescript - 在 Typescript 中做名义类型的最强方法?