C中的嵌套结构说“警告:指针和整数之间的比较”

时间:2014-01-29 05:42:44

标签: c pointers struct

我有一个嵌套结构,定义如下:

/* Buffering incoming CAN messages */
union CANDATA   // Unionize for easier cooperation amongst types
{
    unsigned long long ull;
    signed long long   sll;
    u32        ui[2];
    u16        us[4];
    u8     uc[8];
    u8     u8[8];
    s32        si[2];
    s16        ss[4];
    s8         sc[8];
};
struct CANRCVBUF        // Combine CAN msg ID and data fields
{ //                               offset  name:     verbose desciption
    u32 id;         // 0x00 CAN_TIxR: mailbox receive register ID p 662
    u32 dlc;        // 0x04 CAN_TDTxR: time & length p 660
    union CANDATA cd;   // 0x08,0x0C CAN_TDLxR,CAN_TDLxR: Data payload (low, high)
};
struct CANRCVTIMBUF     // CAN data plus timer ticks
{
    union LL_L_S    U;  // Linux time, offset, in 1/64th ticks
    struct CANRCVBUF R; // CAN data
};

我的变量声明如下:

static struct CANRCVTIMBUF* pfifo1; // Pointer to CAN driver buffer for incoming CAN msgs, high priority

我想我正在围绕这里的指针发生的事情,但我想要做的是访问pfifo1的id值:

if(&pfifo1->R.id == 0x44200000) { // Message to toggle blue led
    toggle_led(15);
}

这为我提供了该行的警告warning: comparison between pointer and integer。我的想法是&pfifo1->R会得到CANRCVBUF结构,我可以使用.从中访问该ID ...但遗憾的是似乎并非如此

2 个答案:

答案 0 :(得分:3)

&pfifo1->R.id

这导致指向int的指针,即它是R.id的地址。如果要将R.id0x44200000

进行比较,则不需要运算符的地址
if(pfifo1->R.id == 0x44200000)

记住; ->取消引用指针,因此不需要&(不是您无论如何都需要它),并且->的优先级高于&

答案 1 :(得分:2)

你很亲密。 &pfifo1->R.id会为您提供id字段的地址,但您希望比较其值。为此,只需删除address-of运算符(&)。

if(pfifo1->R.id == 0x44200000) { // Message to toggle blue led
    toggle_led(15);
}