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

C/C++ 面試經典題深度剖析:從 strcpy 到記憶體管理的內功修煉

     編輯:關於C++

前言:看似簡單,實考驗基本功

企業面試常考手寫 strcpy,能寫出 10 分滿分版本者寥寥無幾。本文收集論壇常見題目,從技術內涵深度剖析,助你建立扎實內功。

找錯題:字串與記憶體陷阱

題 1~3:strcpy 緩衝區溢位


// 1. 來源需 11 bytes (含 \0),目的只有 10 bytes → 溢位
void test1() { char string[10]; char* str1 = "0123456789"; strcpy(string, str1); }

// 2. str1 未以 \0 結尾,strcpy 複製長度不定 → 未定義行為
void test2() { char string[10], str1[10]; for(int i=0;i<10;i++) str1[i]='a'; strcpy(string, str1); }

// 3. strlen 不含 \0,判斷應用 < 10 而非 <= 10
void test3(char* str1) { char string[10]; if(strlen(str1) <= 10) strcpy(string, str1); }

題 4~7:指標參數、區域物件生命週期、malloc 失敗檢查、野指標

  • 題 4:GetMemory(char* p) 以值傳遞指標,函式內修改不影響外部,str 仍為 NULL。
  • 題 5:回傳區域陣列 p[] 的指標,函式返回後記憶體釋放,成懸空指標。
  • 題 6:雙重指標解決題 4 問題,但未檢查 malloc 回傳值;Test 也未 free。
  • 題 7:free(str) 後未置 NULL,產生野指標;同樣缺 malloc 失敗檢查。

內功題:基本功評分標準

strcpy 從 2 分到 10 分的進化


// 2 分:最基本實現
void strcpy(char* strDest, char* strSrc) { while((*strDest++ = *strSrc++) != '\0'); }

// 4 分:const 正確性
void strcpy(char* strDest, const char* strSrc) { ... }

// 7 分:斷言防禦
void strcpy(char* strDest, const char* strSrc) {
    assert(strDest && strSrc);
    while((*strDest++ = *strSrc++) != '\0');
}

// 10 分:鏈式操作支援
char* strcpy(char* strDest, const char* strSrc) {
    assert(strDest && strSrc);
    char* address = strDest;
    while((*strDest++ = *strSrc++) != '\0');
    return address;
}

其他內功考點

  • 零值比較規範:BOOL 用 !var,int 用 var==0,float 用 epsilon 範圍,指標用 var==NULL —— 清晰表達語意。
  • sizeof 陷阱:函式參數 char str[100] 退化為指標,32 位平台 sizeof(str)==4;malloc 回傳指標同理。
  • 宏定義陷阱:#define MIN(A,B) ((A) <= (B) ? (A) : (B)) —— 必須雙層括號,否則 MIN(*p++, b) 導致 p 遞增三次 (副作用);切勿在宏尾加分號。
  • 頭文件防重複與 extern "C":#ifndef/__define__ 防重複包含;extern "C" 解決 C/C++ 混合編譯符號名稱修飾不匹配問題。
  • 字串循環右移:善用 strlen、memcpy/strcpy,避免手寫迴圈。
  • WAV 解析:定義對應結構體,memcpy 整體讀取,體現資料結構組織能力。
  • String 類別規則:含指標成員必須實作「三大法則」(拷貝建構、指派、解構),注意自指派檢查、釋放舊記憶體、回傳 *this。
  • static/const 多重語意:能說出 5 個以上用法者功力深厚。

技巧題:思維敏捷度

  • 大小端檢測:利用 union { int a; char b; } c; c.a=1; return c.b==1; 判斷 Little-endian。
  • 1+2+...+n 求和:直接套用等差數列公式 (1L+n)*n/2,拒絕迴圈累加 —— 數學知識是程式優化的捷徑。

面試題不僅是關卡,更是檢視與精進基本功的鏡子。

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