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

程序員筆試面試高頻易錯點總結:C/C++ 基礎、指針、內存、未定義行為、STL 陷阱

     編輯:關於C語言

一、流程控制與運算符陷阱

1. for 循環執行順序


for (init; cond; step) body;
// 1. init (僅一次)
// 2. cond → false 跳出
// 3. body
// 4. step
// 5. 跳轉 2

2. 短路求值


A && B  // A 為假 → B 不執行,整體為假
A || B  // A 為真 → B 不執行,整體為真
// 利用特性:if (p && p->func()) 安全調用

3. 參數求值順序 (C/C++ 標準未規定)


printf("%d %d\n", a++, ++a); // 未定義行為!輸出不可預測
// 實際由調用約定、編譯器優化決定,嚴禁依賴

二、指針與內存模型

1. 指針大小

  • 32 位系統:4 字節
  • 64 位系統:8 字節
  • 與指向類型無關

2. 數組退化


int arr[10];
sizeof(arr)  // 40 (整個數組大小,不退化)
strlen(arr)  // 錯誤:arr 退化為 int*,非字符串
// 正確:字符串字面量
char str[] = "hello";
sizeof(str)  // 6 (含 \0)
strlen(str)  // 5

3. 經典指針算術題


int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a + 1); // &a 是 int(*)[5],+1 跳過整個數組
// ptr 指向 a[5] (越界位置)
printf("%d %d", *(a+1), *(ptr-1)); // 2, 5
// 關鍵:&a + 1 ≡ &a[5],ptr-1 ≡ &a[4]

4. malloc 分配大小 vs sizeof 指針


char *p = malloc(100);
sizeof(p)     // 4/8 (指針大小)
sizeof(*p)    // 1 (char 大小)
strlen(p)     // 未初始化 UB,賦值後為字符串長度

三、C++ 特有陷阱

1. vector::reserve vs resize

方法capacitysize元素構造訪問方式
reserve(n)≥ n不變無push_back/insert
resize(n)≥ n= n有 (默認構造)operator[] / iterator

2. const 成員函數


class A {
    int x;
    void Func() const { x = 10; } // 編譯錯誤:const 承諾不修改成員
    mutable int cache; // 例外:mutable 允許 const 函數修改
};

3. 結構體指針陷阱 (面試真題)


struct S { int i; int *p; } s;
int *p = &s.i;
s.p = p; // s.p 指向 s.i
s.p[1] = 1; // 相當於 *(s.p+1) = 1,即修改 s.p 指針自身的值!
// s.p 變為 0x1 (非法地址)
s.p[0] = 2; // 嘗試寫入 0x1 → 崩潰

核心:s.p[1] 訪問的是 s.p 後面的內存,恰好是 s.p 自身的存儲位置(結構體成員連續)。整數 1 被強制解釋為指針地址 0x1。

4. new/delete 與 malloc/free

  • new 調用構造函數,delete 調用析構函數
  • malloc 僅分配原始內存,free 僅釋放
  • 嚴禁混用:new 配 delete,new[] 配 delete[],malloc 配 free

四、字符串與字符處理

  • 數字轉字符:char c = digit + '0'; (ASCII 碼連續)
  • string 對象大小固定 (通常 24/32 字節,含指針/長度/容量/小字符串優化緩衝),動態內存分配在堆上,sizeof(string) 不等於字符串長度。

五、棧與堆

  • 局部數組/變量 → 棧 (自動管理,大小受限 ~MB)
  • malloc/new → 堆 (手動管理,大小受限於虛擬內存)
  • 棧溢出:大局部數組、深度遞歸
  • 堆碎片/洩漏:未釋放、頻繁小塊分配釋放

六、持續更新中... 歡迎補充

更多陷阱:虛函數表指釖、多重繼承指針調整、模板代碼膨脹、異常安全、ABA 問題、內存序、鎖自由編程...

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