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