从不同大小的整数转换为指针

标签 c pointers casting integer

我正在使用 Atmel Studio 为 AVR 微 Controller 构建十六进制文件。每次我在使用以下函数时尝试构建某个项目时,都会生成从整数或不同大小转换为指针的警告。

函数是:

static inline uint8 init_reg(uint8 reg, uint8 val)
{
    if (val > 255)
        return E_FAIL;
    *(volatile uint8 *) (reg) = val;
    return S_PASS;
}

我想知道出现这种警告的原因。谢谢...

最佳答案

此处出现警告是因为您的体系结构中的指针是 16 位,IIRC,但您要转换的整数大小不是 16 位,而是 8 位。将较短的整数转换为指针可能会无意中将较高的位清零。

直接的解决方案是先将其转换为 16 位整数,然后再转换为指针:

*(volatile uint8 *) (uint16) reg = val;

但如果可能的话,我更愿意更改函数原型(prototype),以说明整数是一个地址:

static inline uint8 init_reg(uint16 reg, uint8 val)

顺便说一句,您的检查 if (val > 255) 没有用,因为 uint8 永远不会高于 255,所以它是总是假的(这里没有警告?)。

关于从不同大小的整数转换为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34211194/

相关文章:

c - 指向指针或全局变量的指针?

关于 C 中 "while(*s1++ = *s2++);"的困惑

c - 在 C 中打印一个带有两位小数但没有尾随零的 float

c - C中交换字母的加密

c - 在 C 中快速打印字符串或数组的字符

c - 在 C 指针中反转字符串?

c - 指向字符的指针在 C 中指向什么?

java - 使用泛型和动态类类型返回类型转换

c++ - 从模板参数继承并在 C++ 中向上转换

c - 浏览点列表并找到最小窗口大小以显示所有点?