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

高品質 C++/C 程式設計指南 第 7 章 (三):指標參數傳遞記憶體、返回動態記憶體與棧記憶體陷阱

     編輯:關於C++

7.3.3 sizeof:陣列 vs 指標


char a[] = "hello world"; // 12 bytes (含 \0)
char* p = a;
sizeof(a); // 12
sizeof(p); // 4 (指標大小,非指向內容大小)

**C/C++ 無法從指標得知指向記憶體大小**,除非分配時記錄。

**陣列作參數退化為指標**:


void Func(char a[100]) {
    sizeof(a); // 4 (指標),而非 100
}

7.4 指標參數無法直接分配記憶體

錯誤示範


void GetMemory(char* p, int num) {
    p = (char*)malloc(sizeof(char) * num); // 修改的是副本 _p
}

void Test() {
    char* str = nullptr;
    GetMemory(str, 100); // str 仍為 nullptr
    strcpy(str, "hello"); // 崩潰
}

編譯器為參數建副本 _p,函數內修改 _p 不影響實參 p。且每次呼叫洩漏一塊記憶體 (未 free)。

解法 1:指標的指標


void GetMemory2(char** p, int num) {
    *p = (char*)malloc(sizeof(char) * num);
}
GetMemory2(&str, 100); // 傳址

解法 2:返回值傳遞 (更簡潔)


char* GetMemory3(int num) {
    char* p = (char*)malloc(sizeof(char) * num);
    return p;
}
str = GetMemory3(100); // 直接接收

7.4.4-5 返回指標的生死線:棧 vs 堆 vs 靜態區


// ❌ 返回棧記憶體指標
char* GetString() {
    char p[] = "hello world"; // 棧上
    return p; // 函數結束 p 銷毀,返回垃圾指標
}

// ✅ 返回靜態區字串字面值 (但設計錯誤)
char* GetString2() {
    char* p = "hello world"; // 靜態區,唯讀
    return p;
}
  • 棧記憶體:函數結束自動銷毀,**絕不可返回其指標/參考**。
  • 靜態區字面值:生命週期全程,但**唯讀**、**全程共享同一塊**,若呼叫端修改 → 崩潰。設計上應回傳動態分配記憶體 (malloc/new) 或 std::string。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved