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

C 語言交換函數陷阱:為何 swap(int *p1, int *p2) 會導致系統故障?

     編輯:程式設計綜合問答

問題代碼

swap(int *p1, int *p2) {
    int *p;
    *p = *p1;
    *p1 = *p2;
    *p2 = *p;
}

選項:A. 交換值 B. 正確但無法改變值 C. 交換地址 D. 可能造成系統故障,因為使用了空指針

錯誤分析

  1. int *p; 定義了一個未初始化的野指針,其值隨機(可能為 0、垃圾地址)。
  2. *p = *p1; 嘗試通過野指針寫入內存,觸發未定義行為:若 p 為 0 導致空指針解引用崩潰;若為隨機地址破壞其他數據。
  3. 函數參數傳遞的是指針副本,無法修改主調函數中的指針變量本身(若需修改指針本身應傳二級指針或引用)。

正確寫法

// 交換指針指向的值(需傳入有效地址)
void swap(int *p1, int *p2) {
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

// 交換指針本身(C++ 引用或 C 二級指針)
void swap_ptr(int *&p1, int *&p2) {  // C++
    int *temp = p1;
    p1 = p2;
    p2 = temp;
}

核心教訓

  • 指針變量定義後必須初始化(指向合法內存或置 NULL)。
  • 交換數值需使用臨時變量存儲數值,而非未初始化指針。
  • C 語言參數傳值,若需修改指針本身需傳 int **。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved