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

C 語言指標核心三角:野指標成因、空指標判斷陷阱、void* 正確用法

     編輯:更多程式設計知識

指標操作是 C 語言分水嶺。本文聚焦實戰高頻坑點:野指標三大來源、空指標判斷跨平台差異、void* 五大使用規則,附代碼反模式與正確模式對照。

一、野指標:不是 NULL,是「指向垃圾」

三大成因

  1. 未初始化:char* p; strcpy(p, "x"); → 垃圾位址
    • 正確:char* p = NULL; 或 char* p = malloc(100);
  2. 釋放後未置空:
    char* p = malloc(100);
    strcpy(p, "hello");
    free(p);        // 記憶體還給堆,p 仍指向原位址
    if (p != NULL)  // 真!但指向垃圾
        strcpy(p, "world"); // 崩潰/靜默破壞
    
    • 正確:free(p); p = NULL;
  3. 超出作用域:
    void Test() {
        A* p;
        { A a; p = &a; } // a 生命週期結束
        p->Func();       // p 成野指標
    }
    
    • 正確:延長物件生命週期、用動態配置+智慧指標、避免儲存區域物件位址

二、空指標 / NULL / 0:跨平台判斷陷阱

  • NULL 定義:C 多為 (void*)0,C++ 為 0(C++11 推薦 nullptr)
  • 某些嵌入式平台 NULL 非 0(如 0xDEADBEEF)

判斷寫法優先序

  1. if (p == NULL) / if (NULL == p) —— 明確、跨平台安全
  2. if (!p) —— 依賴隱性轉 bool,C++ 推薦,C 需確認 NULL 定義
  3. 避免 if (p == 0) —— 平台相依風險

防禦性初始化

Item* pItem = itemList.getItem(index); // 可能回傳 NULL
if (pItem == NULL) return ERROR;       // 必須檢查
pItem->doSomething();                  // 安全

三、void* 五大使用規則

規則說明正確範例錯誤範例
1. 函數無回傳值 → void強制語意明確void init();init() { return 1; } (隱性 int)
2. 函數無參數 → voidC++ 強制,C 允許傳參int func(void);func(2); (C++ 編譯錯)
3. 謹慎用 void* 運算ANSI 禁止 ++,GNU 允許(char*)pvoid++;pvoid++;
4. 參數可為任意型別 → void*記憶體操作、泛型介面memcpy(void*, void*, size_t)memcpy(char*, char*, size_t)
5. void 不能定義變數抽象型別,無實例—void a; (編譯錯)

void* 指標轉換鐵律

  • 有型別 → 無型別:安全(男人→人)
  • 無型別 → 有型別:需強制轉型(人→男人 不安全)
  • C 隱性允許雙向,C++ 強制 static_cast

總結:指標操作三不原則

  1. 不使用未初始化指標
  2. 不使用已釋放指標(釋放即置 NULL)
  3. 不儲存臨時物件位址
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved