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

C 多級指針強制類型轉換陷阱:指針本質不變,需雙重解引用匹配內存佈局

     編輯:程式設計綜合問答

錯誤代碼分析


void funb(int** x) {
    int* p = (int*)x; // 錯誤:將 int** 強轉為 int*
    *p = 300;         // 只解引用一次,修改的是指針變量地址處的值,非目標 int
}

內存佈局解析

  • 主調用:int i=100; funa(&i); → funa 參數 int* x 指向 i。
  • funa 內:int* i = x; → *i=200 修改 i 為 200。
  • 調用 funb(&i):傳遞 i 的地址,類型 int**,指向存儲 i 地址的變量。
  • funb 參數 int** x 指向該地址。
  • 正確訪問目標 int:**x 或 *(*x)(兩次解引用)。

修正寫法


void funb(int** x) {
    // 方法 1:直接雙重解引用
    **x = 300;

    // 方法 2:臨時變量保持類型清晰
    int* p = *x;   // p 指向目標 int
    *p = 300;

    // 方法 3:若必須用 int* 接收參數(不推薦)
    // int* p = (int*)x; // 強轉後 p 指向「指向 int 的指針」
    // *(int**)p = 300;  // 再次強轉回 int** 解引用
}

核心原則

指針強轉不改變內存佈局。int** 內存中存儲的是「指向 int 的指針的地址」,無論轉為何種類型,要到達目標 int 必須解引用兩次。建議保持類型匹配,避免強轉;必要時用 static_cast (C++) 限制轉換範圍。

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