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

C/C++ 基礎功測驗:從 strcpy 陷阱到記憶體管理陷阱

     編輯:關於C語言

前言

看似簡單的 strcpy、指標傳遞、動態記憶體操作,實則暗藏細節。本文以面試真題形式,層層遞進從 2 分寫法進化到 10 分工業級實作,並揭示 7 大記憶體管理經典錯誤。

一、strcpy 進化史

2 分:最朴素實作

void strcpy(char* dest, char* src) {
    while ((*dest++ = *src++) != '\0');
}

4 分:加 const 正確性

void strcpy(char* dest, const char* src) { ... }

7 分:加斷言防禦

void strcpy(char* dest, const char* src) {
    assert(dest && src);
    while ((*dest++ = *src++) != '\0');
}

10 分:支援鏈式呼叫

char* strcpy(char* dest, const char* src) {
    assert(dest && src);
    char* ret = dest;
    while ((*dest++ = *src++) != '\0');
    return ret;
}

關鍵點:const 語意、assert 防禦、回傳目的地址支援 strcat(strcpy(buf, a), b) 鏈式風格。

二、字串長度陷阱

void test3(char* src) {
    char buf[10];
    if (strlen(src) <= 10)  // 錯!strlen 不含 '\0'
        strcpy(buf, src);   // src 長度 10 時會溢位
}
// 正確:if (strlen(src) < sizeof(buf))

三、七大記憶體管理經典錯誤

編號錯誤代碼核心問題修正要點
4void Get(char* p){ p=malloc(100); }指標按值傳遞,呼叫端指標不變傳 char** 或回傳指標
5char* Get(){ char p[]="hi"; return p; }回傳區域陣列地址(棧上),離開作用域失效動態配置或靜態/全域儲存
6*p = malloc(n); 未檢查 NULL配置失敗時解引用野指標if(!*p) handle_error();
7free(p); 未置 NULL產生野指標,後續誤用free(p); p=NULL;
6/7未釋放動態記憶體記憶體洩漏配置釋放配對,RAII 管理
-swap(int* a,int* b){ int* p; *p=*a; ... }p 未初始化(野指標)用 int tmp 而非指標
-指標運算越界緩衝區溢位界檢查、使用 std::span/容器

四、零值比較內功

類型推薦寫法理由
BOOLif (!flag)邏輯判斷語意清晰
整數if (val == 0)數值比較,避免隱性轉換
浮點數if (fabs(x) <= EPS)浮點不精確,不可用 ==
指標if (ptr == nullptr)語意明確,非邏輯非

五、sizeof 陷阱

void Func(char str[100]) { sizeof(str); } // 4 (指標大小)
void* p = malloc(100); sizeof(p);         // 4 (指標大小)
// 陣列退化為指標,sizeof 失去元素數量資訊

六、陣列名本質

  1. 代表資料結構本身:char s[10]; sizeof(s) == 10
  2. 隱性轉換為指標常量:s++ 編譯錯誤(非左值)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved