我在IAR Embedded workbench IDE中编码c。我在头文件中有以下内容。
typedef union {
uint8_t payload;
struct UBX_NAV_POSLLH nav_posllh;
struct UBX_NAV_STATUS nav_status;
struct UBX_NAV_DOP nav_dop;
struct UBX_NAV_SOL nav_sol;
struct UBX_NAV_VELNED nav_velned;
struct UBX_NAV_TIMEUTC nav_timeutc;
struct UBX_NAV_SVINFO nav_svinfo;
} UBXPayload;
struct UBXHeader {
uint8_t class;
uint8_t id;
uint16_t len;
uint8_t ck_a;
uint8_t ck_b;
};
struct UBXPacket {
struct UBXHeader header;
UBXPayload payload;
};
这是我的源文件:
static char *c_buffer
void myinit( )
{
c_buffer= (char*)malloc(50);
}
int myfunc(uint8_t c, char *c_buffer)
{
static uint8_t rx_count = 0;
struct UBXPacket *ubx = (struct UBXPacket *)c_buffer;
for(int i=0; i<3; i++){
ubx->payload.payload[rx_count] = c; /* Error[Pe142]: expression must have pointer- to-object type */
rx_count++;
}
}
void main( )
{
char mychar = 'h';
myinit( );
myfunc(mychar, c_buffer);
}
在另一个用ARM GCC编译器编译的代码示例中,相同的 union 定义如下。它汇编良好&amp;效果很好。
typedef union {
uint8_t payload[0]; /* here [0] is placed */
struct UBX_NAV_POSLLH nav_posllh;
struct UBX_NAV_STATUS nav_status;
struct UBX_NAV_DOP nav_dop;
struct UBX_NAV_SOL nav_sol;
struct UBX_NAV_VELNED nav_velned;
struct UBX_NAV_TIMEUTC nav_timeutc;
struct UBX_NAV_SVINFO nav_svinfo;
} UBXPayload;
但是在IAR C编译器中给出了错误。有什么建议吗? 我不明白以下一行
struct UBXPacket *ubx = (struct UBXPacket *)c_buffer;
答案 0 :(得分:1)
在UBXPayload
联合中,payload
成员是单个字符,但您将其用作数组。当你把它变成一个数组时,你就把它变成一个零大小的数组,这样对数组的所有写操作都会超出范围,导致undefined behavior(因此它的工作效果不如你想象的那么好)。