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
廣告

© . All rights reserved.