【问题标题】:avr-gcc warning: initialization from incompatible pointer typeavr-gcc 警告:从不兼容的指针类型初始化
【发布时间】:2016-05-11 08:42:20
【问题描述】:

我不确定如何修复这段代码的警告(警告与第二行有关)。 这不是我的代码,但它确实工作得很好。但是,我想摆脱警告但很困惑。 v 是一个无符号长整数,我们希望将其放入指针中。我们正在使用 avr-gcc。

../../uJ/uj.c:1149:20:警告:从不兼容的指针类型初始化 const UInt8* d = &v;

static void ujThreadPrvPut32(UInt8* ptr, UInt32 v){         //to pointer
    const UInt8* d = &v;

    *ptr++ = *d++;
    *ptr++ = *d++;
    *ptr++ = *d++;
    *ptr = *d;
}

【问题讨论】:

  • C 中的指针指向具体类型,即 d++ 跳过 1 个字节,v 参数为 4 个字节长。编译器无法理解你想要什么。以下是演员表的好答案

标签: c avr-gcc


【解决方案1】:

添加演员表:

const UInt8* d = (const UInt8*)&v;

【讨论】:

    【解决方案2】:

    作为对其他答案的补充:

    首先将ptr 参数作为常量指针提供为better practice

    static void ujThreadPrvPut32(UInt8* const ptr, UInt32 v);
    

    由于ptr 提供了数据应该到达的目标地址,因此函数不应更改此地址,只能更改该位置的内容。

    另一方面,您可以只使用 memcpy()。

    uint8_t* ptr = 0;   // has to be set to desired target address obviously
    uint32_t value = 123;
    
    memcpy(ptr, &value, sizeof(value));
    

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 2013-12-16
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多