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

C++ 指針未初始化傳參陷阱:值傳遞與指針修改的區別

     編輯:C++ 入門

C++ 指針未初始化傳參陷阱:值傳遞與指針修改的區別

常見錯誤:將未初始化指針傳給函數,在函數內 new 分配記憶體並賦值給形參指針,返回後實參指針仍為原值(如 null)。

錯誤示範

void testptrnoret(int* a, int n) {
    a = new int[n]; // 修改的是形參副本
    for (int i = 0; i < n; i++) a[i] = i;
}

int main() {
    int* b = 0;
    testptrnoret(b, 4); // b 仍為 0,記憶體洩漏且無法訪問
}

原因:C++ 函數參數默認值傳遞。指針作為值被複製,函數內修改指針變量本身(指向新地址)不影響外部實參。

正確做法一:返回指針

int* testptrret(int* a, int n) {
    a = new int[n];
    for (int i = 0; i < n; i++) a[i] = i;
    return a; // 通過返回值傳回新地址
}
int main() { int* a = testptrret(nullptr, 4); }

正確做法二:傳指針的引用 / 指針的指針

void testptrref(int* &a, int n) { // 引用傳遞
    a = new int[n];
    for (int i = 0; i < n; i++) a[i] = i;
}
void testptrptr(int** a, int n) { // 二級指針
    *a = new int[n];
    for (int i = 0; i < n; i++) (*a)[i] = i;
}

核心區別

操作影響外部實參?
修改指針指向的內容 (*p = val)✅ 是
修改指針變量本身 (p = new_addr)❌ 否 (值傳遞時)
傳指針引用 / 二級指針修改指針本身✅ 是

調試時觀察指針地址變化:傳值調用前後實參指針地址不變,但函數內形參指針地址不同。理解「指針也是值」是避免此類 Bug 的關鍵。

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