2011-08-24 27 views
5

我想要mystruct1中的參數行offsetof()。我試過你如何在結構上使用offsetof()?

offsetof(struct mystruct1, rec.structPtr1.u_line.line) 

offsetof(struct mystruct1, line) 

但既不工程。

union { 
    struct mystruct1 structPtr1; 
    struct mystruct2 structPtr2; 
} rec; 

typedef struct mystruct1 { 
    union { 
     struct { 
      short len; 
      char buf[2]; 
     } line; 

     struct { 
      short len; 
     } logo; 

    } u_line; 
}; 
+0

你不能爲我們提供結構定義的可編譯代碼嗎?或者省略'struct mystruct2' ... –

+0

你是什麼意思「既不工作」? –

回答

7

offsetof()宏有兩個參數的偏離。 C99的標準說(在§7.17<stddef.h>):

offsetof(type, member-designator) 

其擴展到具有鍵入size_t,的 值,其以字節爲單位的偏移量的整數常量表達式,該結構構件(由指定成員指定人), 從其結構(指定類型)開始。的類型和構件指示符 應使得給定

static type t; 

那麼表達式&(t.member-designator)計算結果爲地址常量。

所以,你需要寫:

offsetof(struct mystruct1, u_line.line); 

然而,我們可以觀察到,答案將是零,因爲mystruct1包含union作爲第一件(只),和的line部分它是聯合的一個元素,所以它將在偏移量爲0.

+0

謝謝你工作得很好,很好的解釋! – ken

0

您的struct mystruct1有1個成員名爲u_line。你可以看到,成員

offsetof(struct mystruct1, u_line); // should be 0 

或成員的路線,如果你指定的每個「生兒育女水平」

offsetof(struct mystruct1, u_line.line); 
offsetof(struct mystruct1, u_line.line.buf); 
offsetof(struct mystruct1, u_line.logo); 
0

首先,AFAIK,offsetof旨在與結構的直接成員一起使用(我對此是否正確?)。

第二,知道流行offsetof實現的內部細節,我可以建議嘗試

offsetof(struct mystruct1, u_line.line) 

這應該工作。它是否符合標準對我來說是一個懸而未決的問題。

P.S.根據@Jonathan Leffler的回答判斷,這實際上應該起作用。

+0

「我對嗎?」我不這麼認爲(在測試gcc之後)。 gcc接受'offsetof'表達式上的「深度」成員。 – pmg

+1

@pmg:好吧,這樣的問題不能通過「測試」來回答。 – AnT

+0

對@安德烈。在喬納森的答案中發佈的標準引用允許與「深度」成員一起使用'offsetof'。 – pmg