[英]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.