代码之家  ›  专栏  ›  技术社区  ›  12431234123412341234123

如果uint8_t存在,uint8_t*是否等同于无符号char*?

  •  0
  • 12431234123412341234123  · 技术社区  · 4 年前

    如果 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与 -Wincompatible-pointer-types 警告关于 unsigned char *charPtr=&intVar; uint8_t *uint8Ptr=&intVar; ,但有了石膏,这个警告就消失了。这并没有回答问题。 可能没有一个系统 uint8_t * 将与 unsigned char * 但是标准说了什么?

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

    0 回复  |  直到 4 年前
        1
  •  1
  •   Joshua    4 年前

    证明:

    该标准断言 sizeof(unsigned char) 1 .

    该标准声称没有分数大小。

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

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

    因此:

    你不能有两个 无符号字符 s in a uint_8 根据鸽子洞原理。

    尺寸 uint_8 必须为1。

    因此blitting 无符号字符 通过 uint8_t uint8_t 通过 无符号字符 定义。

    但是,您的代码并不完全有效,因为当您将指向int的指针转换为指向 无符号字符 在C中,指针强制转换是可传递的,除非向函数指针强制转换为非函数指针,否则我们可以像直接从 int * unsigned char * .*

    *这只适用于演员。通过工会或会员大显身手可以挑战这一点。

    推荐文章