offsetof
是一個在 C 和 C++ 語言中常用的宏,用于計算結構體成員在內存中的偏移量
以下是如何正確使用 offsetof
宏的示例:
<stddef.h>
,該文件提供了 offsetof
宏的定義。#include <stddef.h>
Student
的結構體,其中包含三個成員:id
、name
和 score
。typedef struct {
int id;
char name[50];
float score;
} Student;
offsetof
宏計算結構體成員在內存中的偏移量。例如,我們可以計算 name
成員相對于結構體起始地址的偏移量。size_t name_offset = offsetof(Student, name);
Student
結構體實例的指針 p_student
,我們可以使用偏移量來獲取 name
成員的地址。Student *p_student = /* ... */;
char *name_ptr = (char *)p_student + name_offset;
需要注意的是,offsetof
宏只能用于計算標準布局類型(standard-layout types)的成員偏移量。對于非標準布局類型,使用 offsetof
可能會導致未定義行為。在 C++ 中,如果結構體或類具有虛函數、繼承關系或多態性,則該類型不是標準布局類型。在 C 語言中,如果結構體具有位字段(bit-fields)或不連續的成員,則該類型也不是標準布局類型。