首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言結構體指標與首地址關係:程式碼驗證結構體指標即首成員地址

     編輯:程式設計疑難解答

核心結論

結構體指標的值(即結構體首地址)等於其第一個成員的地址。 這是 C 標準保證的記憶體佈局規則(前提:結構體非空、無位欄位導致對齊調整)。

驗證程式碼

#include <stdio.h>

struct A {
    int arr[100];
};

int main() {
    struct A a;
    struct A *pA = &a;
    printf("pA          = %p\n", (void*)pA);
    printf("&a.arr[0]    = %p\n", (void*)&a.arr[0]);
    printf("pA == &a.arr[0] ? %s\n", pA == (void*)&a.arr[0] ? "true" : "false");
    return 0;
}

輸出範例

pA          = 0x7ffc12345670
&a.arr[0]    = 0x7ffc12345670
pA == &a.arr[0] ? true

延伸知識點

  • offsetof 巨集:`` 中定義,`offsetof(struct A, arr)` 為 0,印證第一個成員偏移量為 0。
  • 結構體指標轉換:`(char*)pA + offsetof(struct A, member)` 可安全取得任意成員地址,這是容器實作(如 Linux kernel `container_of`)的基石。
  • 對齊規則:編譯器可能在成員之間插入填充位元組,但第一個成員永遠從結構體起始位置開始。

總結

結構體指標「包含」的是整個結構體的起始位址,透過成員偏移量即可存取任意成員。理解這一點,對掌握 C 語言記憶體模型、實作泛型資料結構至關重要。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved