帮助转换指向联合的指针

时间:2010-10-06 11:14:13

标签: c pointers casting unions

我正在研究C固件项目。我有一个被定义为的联盟,

typedef union {
    unsigned long value;
    unsigned char bytes[4];
} LONGVALUE;

我也有一个具有这个原型的函数,

char sendHexToASCII_UART(char *msg, int cnt);

和LONGVALUE类型的变量定义为,

LONGVALUE countAddr;

问题: 我用一个数组(tempBuff1)中的值填充union变量的各个字节,然后我想将union中第一个元素的地址传递给一个将它打印到UART的函数。在我的函数调用sendHexToASCII_UART((int *)countAddr.bytes[0], 4);上,我得到一个编译器警告说“从不同大小的整数转换为指针”。有人可以解释为什么我得到这个以及如何让它消失?注意:将(int *)强制转换为(char *)会导致相同的警告。

countAddr.bytes[0] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS];
countAddr.bytes[1] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 1];
countAddr.bytes[2] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 2];
countAddr.bytes[3] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 3];
sendHexToASCII_UART((int *)countAddr.bytes[0], 4); 

4 个答案:

答案 0 :(得分:4)

为什么不呢:

sendHexToASCII_UART((char *)countAddr.bytes, 4);

甚至更好:

sendHexToASCII_UART((char *)countAddr.bytes, sizeof(countAddr.bytes));

答案 1 :(得分:1)

sendHexToASCII_UART((int *)(& countAddr.bytes [0]),4);

或:

sendHexToASCII_UART((int *)(countAddr.bytes),4);

答案 2 :(得分:0)

表达式的值

countAddr.bytes[0]

是一个unsigned char(数组中的第一个字节),它会转换为int指针,因此会出现警告。正如Oli所说,你必须删除[0]以获得指向数组的指针,这就是你想要的。

答案 3 :(得分:0)

或尝试此操作而不创建LONGVALUE类型的变量

sendHexToASCII_UART(((LONGVALUE *)0)->bytes, 4);