如果 uint8_t 存在,uint8_t* 是否等同于 unsigned char*? [重复]

问题描述 投票:0回答:1

如果

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 的。请不要将此问题标记为链接问题的重复,因为问题绝对不一样。

c pointers language-lawyer uint8t
1个回答
2
投票

证明:

标准断言

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 进行位块传输可以克服这一点。

© www.soinside.com 2019 - 2024. All rights reserved.