簡體   English   中英

帶位域​​的結構偏移

[英]structure offset with bit field

我有一個關於使索引偏移到結構中的字段的問題,下面是我用來測試的代碼:

#include <stdio.h>
typedef struct ipv4_pkt_struct 
{
    /*ethernet hdr*/
    unsigned char   DestMacAddr[6]      ;
    unsigned char   SrcMacAddr[6]       ;
    unsigned char   EthernetType[2]     ;
    /*IP hdr*/
    unsigned char   Version           :4;
    unsigned char   IHL               :4;
    unsigned char   TypeofService[2]    ;
    unsigned char   Total_Length[4]    ;

} ipv4_pkt_struct_t; 

int main()
{

    ipv4_pkt_struct_t A;

    printf ("%d\n",(unsigned char*)A.TypeofService - (unsigned char*)A.DestMacAddr) ;
    printf("Hello World");

    return 0;
}

輸出為:

15                                                                                                        
Hello World 

正確,但是如果我做類似的事情:

printf ("%d\n",(unsigned char*)A.IHL - (unsigned char*)A.DestMacAddr) ;

它會給我非常有線的輸出:

1296908304                                                                                              
Hello World

printf ("%d\n",(unsigned char*)&A.IHL - (unsigned char*)A.DestMacAddr) ;

給出一個編譯錯誤:

main.c: In function 'main':
main.c:29:5: error: cannot take address of bit-field 'IHL'
     printf ("%d\n",(unsigned char*)&A.IHL - (unsigned char*)A.DestMacAddr) ;

如何獲得正確的偏移量?

在C位字段中,成員不可尋址。

n1570-§6.5.3.2(p1):

一元&運算符的操作數應為函數指定符, []或一元*運算符的結果,或者是指定不是位字段的對象的左值[...]

除了那條線

printf ("%d\n",(unsigned char*)A.TypeofService - (unsigned char*)A.DestMacAddr) ;  

應該

printf ("%td\n", A.TypeofService - A.DestMacAddr) ;

您正在將(未初始化的)無符號字符轉換為指針; 除了訪問未初始化的數據是未定義的行為外,即使您將其初始化,也要使用值而不是使用這些值所在的地址進行計算。

我建議使用offsetof ,它是為您的用例而構建的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM