- C 標準庫
- C 庫 - 首頁
- C 庫 - <assert.h>
- C 庫 - <complex.h>
- C 庫 - <ctype.h>
- C 庫 - <errno.h>
- C 庫 - <fenv.h>
- C 庫 - <float.h>
- C 庫 - <inttypes.h>
- C 庫 - <iso646.h>
- C 庫 - <limits.h>
- C 庫 - <locale.h>
- C 庫 - <math.h>
- C 庫 - <setjmp.h>
- C 庫 - <signal.h>
- C 庫 - <stdalign.h>
- C 庫 - <stdarg.h>
- C 庫 - <stdbool.h>
- C 庫 - <stddef.h>
- C 庫 - <stdio.h>
- C 庫 - <stdlib.h>
- C 庫 - <string.h>
- C 庫 - <tgmath.h>
- C 庫 - <time.h>
- C 庫 - <wctype.h>
- C 標準庫資源
- C 庫 - 快速指南
- C 庫 - 有用資源
- C 庫 - 討論
- C 程式設計資源
- C 程式設計 - 教程
- C - 有用資源
C 庫 - offsetof() 宏
C 庫的 offsetof(type, member-designator) 宏生成一個型別為 size_t 的常量整數,表示結構體成員從結構體開頭處的偏移量(以位元組為單位)。成員由 member-designator 指定,結構體名稱由 type 指定。
此宏通常用於像連結串列這樣的資料結構中。
語法
以下是 C 庫中 offsetof() 宏的語法:
offsetof(type, member-designator)
引數
此函式僅接受兩個引數:
type − 這是 member-designator 為有效成員指定符的類型別。
member-designator − 這是類型別的成員指定符。
返回值
此宏返回型別為 size_t 的值,該值是成員在 type 中的偏移量。
示例 1
以下 C 庫程式說明了 offsetof() 宏的使用。
#include <stddef.h>
#include <stdio.h>
struct address {
char name[50];
char street[50];
int phone;
};
int main () {
printf("name offset = %d byte in address structure.\n",
offsetof(struct address, name));
printf("street offset = %d byte in address structure.\n",
offsetof(struct address, street));
printf("phone offset = %d byte in address structure.\n",
offsetof(struct address, phone));
return(0);
}
輸出
執行上述程式碼後,我們得到以下結果:
name offset = 0 byte in address structure. street offset = 50 byte in address structure. phone offset = 100 byte in address structure.
示例 2
以下示例說明了 offsetof() 宏的重要性,它對於建立資料結構(連結串列)很有用。
#include <stdio.h>
#include <stddef.h>
struct Node {
int data;
struct Node* next;
};
int main() {
size_t offset = offsetof(struct Node, data);
printf("Offset of 'data' in Node: %zu bytes\n", offset);
return 0;
}
輸出
執行上述程式碼後,我們得到以下結果:
Offset of 'data' in Node: 0 bytes
示例 3
該程式演示瞭如何使用 offsetof() 宏查詢結構體中特定成員的偏移量。
#include <stdio.h>
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
typedef struct tutorialspoint
{
int i;
double d;
char z;
} tutortype;
int main()
{
printf("%lu", OFFSETOF(tutortype, z));
getchar();
return 0;
}
輸出
上述程式碼產生以下結果:
16
廣告