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

C 指針賦值陷阱:未初始化指針導致段錯誤的真相

     編輯:關於C語言

指針操作是 C 語言最強大也最危險的特性。本文通過一個經典段錯誤案例,揭示「指針變量本身 vs 指向的內存」區別,強調指針使用前必須指向合法內存。

1. 錯誤代碼


int *i;
*i = 12; // 段錯誤!

2. 錯誤原因

  • int *i 定義一個指針變量,存儲地址值
  • 未初始化,其值為隨機垃圾地址
  • *i = 12 嘗試向該隨機地址寫入 → 非法內存訪問 → 段錯誤

關鍵認知:*i = 12 語法正確,但前提是 i 指向可寫的合法內存。

3. 正確用法


// 指向現有變量
int j;
int *i = &j;
*i = 12; // 合法,修改 j

// 或動態分配
int *i = malloc(sizeof(int));
if (i) {
    *i = 12;
    free(i);
}

4. 進階:動態數組與指針


int n = 10;
int *arr = malloc(n * sizeof(int));
if (arr) {
    for (int k = 0; k < n; k++) arr[k] = k;
    free(arr);
}

5. 避坑清單

  1. 定義指針立即初始化(NULL、&var、malloc)
  2. 解引用前檢查非空
  3. 釋放後置 NULL 防野指針
  4. 使用工具檢測:Valgrind、AddressSanitizer、静态分析

總結

指針是地址的變量,「有指針不等於有內存」。所有指針操作的前提:指向合法、可訪問、生命週期內的內存區域。這是 C/C++ 內存安全的基石。

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