c语言 offsetof函数,C 库宏 - offsetof()函数
宏offsetof
標(biāo)準(zhǔn)庫stddef.h
定義 size_t offsetof(type, member);
分析
C 庫宏 offsetof(type, member) 會生成一個類型為 size_t 的整型常量,它是一個結(jié)構(gòu)成員(member)相對于結(jié)構(gòu)(type)開頭的字節(jié)偏移量。成員是由 member 給定的,結(jié)構(gòu)的名稱是在 type 中給定的。
type -- 這是一個 參數(shù)class類型,是結(jié)構(gòu)體的名字,第二個參數(shù)member是結(jié)構(gòu)體成員的名字,是一個有效的成員指示器。該宏返回結(jié)構(gòu)體class中成員member的偏移量。偏移量是size_t類型的。
member -- 這是一個 class 類型中的成員指示器,就是指定的class里的一個成員量。通常通過member得到type的起始地址,即指向type類型的指針。
該宏返回類型為 size_t 的值,表示 type 中成員的偏移量,是一個無符號整數(shù)類型數(shù)值,是 sizeof 關(guān)鍵字的結(jié)果。需要注意的是,這里在實際環(huán)境中會涉及到C語言內(nèi)存對齊機(jī)制。
下面的實例演示了 offsetof() 宏的用法。
#include
#include
struct address {
char name[50];
char nationality[50];
int phone;
};
int main()
{
printf("address 結(jié)構(gòu)中的 name 偏移 %d 字節(jié)。\n",
offsetof(struct address, name));
printf("address 結(jié)構(gòu)中的 nationality 偏移 %d 字節(jié)。\n",
offsetof(struct address, nationality));
printf("address 結(jié)構(gòu)中的 phone 偏移 %d 字節(jié)。\n",
offsetof(struct address, phone));
return(0);
}
編譯并運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
address 結(jié)構(gòu)中的 name 偏移 0 字節(jié)。
address 結(jié)構(gòu)中的 nationality 偏移 50 字節(jié)。
address 結(jié)構(gòu)中的 phone 偏移100 字節(jié)。
應(yīng)用
在實際的使用中,比較經(jīng)典的情況:已知一個已經(jīng)分配空間的結(jié)構(gòu)體對象指針A中的某個成員B,使用offsetof宏,可根據(jù)B在A中的偏移量,獲取該結(jié)構(gòu)體指針對象A的首地址,從而進(jìn)一步使用A。
總結(jié)
以上是生活随笔為你收集整理的c语言 offsetof函数,C 库宏 - offsetof()函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言 中insert变量值,c – 在
- 下一篇: 用c语言编写5颗骰子任意投掷总数为15