2010-01-09 40 views
6

Trong ngôn ngữ C, cách lấy địa chỉ bắt đầu của cấu trúc từ địa chỉ thành viên của nó?cách lấy địa chỉ bắt đầu của cấu trúc từ địa chỉ thành viên

struct type1 { 
    //... 
    int member1; 
    //... 
}; 
struct type1 obj1; 

ptr1 là địa chỉ của thành viên member1 trong obj1, làm thế nào để xác định
vĩ mô #define start_add(ptr1, type1, member1) để có được obj1 của địa chỉ
bắt đầu?

Trả lời

14

Bạn có thể làm điều này bằng offsetof:

#define start_add(ptr1, type1, member1) ((type1 *)((char *)(ptr1) - offsetof(type1, member1))) 
+2

Tôi nghĩ rằng bạn có thêm một '& 'trước' (ptr1) '. 'ptr1' là địa chỉ của thành viên. –

+0

Khá đúng, cố định. –

+0

Bạn cũng nên thêm một tập hợp dấu ngoặc xung quanh toàn bộ kết quả macro - hãy nhớ rằng '->' có ưu tiên cao hơn '(type)', vì vậy nếu bạn muốn áp dụng '->' cho kết quả bạn sẽ cần chúng. – caf

1

này từ cửa sổ WDK

/* 
#define CONTAINING_RECORD(address, type, field) ((type *)(\ 
     (PCHAR)(address) - \ 
     (ULONG_PTR)(&((type *)0)->field))) 
*/ 
Các vấn đề liên quan