2

我正在研究 C 固件项目。我有一个定义为的工会,

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

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

char sendHexToASCII_UART(char *msg, int cnt);

和定义为 LONGVALUE 类型的变量,

LONGVALUE countAddr;

问题:我用数组​​(tempBuff1)中的值填充联合变量的各个字节,然后我想将联合中第一个元素的地址传递给将其打印到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

4 回答 4

4

为什么不只是:

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

甚至更好:

sendHexToASCII_UART((char *)countAddr.bytes, sizeof(countAddr.bytes));
于 2010-10-06T11:16:03.927 回答
1

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

或者:

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

于 2010-10-06T11:17:30.443 回答
0

表达式的值

countAddr.bytes[0]

是一个无符号字符(数组中的第一个字节),您将其转换为一个 int 指针,因此会发出警告。正如 Oli 所说,您必须删除[0]以获得指向数组的指针,这就是您想要的。

于 2010-10-06T11:18:14.593 回答
0

或者尝试这个而不创建 LONGVALUE 类型的变量

sendHexToASCII_UART(((LONGVALUE *)0)->bytes, 4);
于 2010-10-06T12:28:10.397 回答