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

C語言經典面試題精選:字符串、邏輯運算與sizeof陷阱深度解析

     編輯:關於C語言

前言

C 語言面試常考察對記憶體模型、指針本質、運算符優先級及短路求值的理解。本文精選三道高頻題目,逐行拆解輸出結果與底層原理,助你避開常見陷阱。


題目一:字符串數組 vs 字符指針比較

代碼

[cpp]
int main() {
    char str1[] = "hello world";
    char str2[] = "hello world";
    char *str3 = "hello world";
    char *str4 = "hello world";

    if (str1 == str2) printf("str1 and str2 are same.\n");
    else printf("str1 and str2 are not same.\n");

    if (str3 == str4) printf("str3 and str4 are same.\n");
    else printf("str3 and str4 are not same.\n");
    return 0;
}

輸出結果

str1 and str2 are not same.
str3 and str4 are same.

深度解析

  • str1/str2:定義為字符數組,編譯器在棧上分配兩塊獨立的 12 字節空間,分別拷貝字面量內容。兩數組首地址不同,故 str1 == str2 為假。
  • str3/str4:定義為字符指針,均指向只讀數據段中同一份字面量 "hello world" 的地址(編譯器優化合併相同字面量)。故 str3 == str4 為真。

核心結論:數組名代表首元素地址,每次定義即分配新空間;指針指向字面量時共享唯一拷貝。


題目二:邏輯運算短路求值與函數調用順序

代碼

[cpp]
int Fun1(char* str) { printf("%s\n", str); return 0; }
int Fun2(char* str) { printf("%s\n", str); return 1; }

int main() {
    int res1, res2;
    res1 = (Fun1("a") && Fun2("b")) || (Fun1("c") || Fun2("d"));
    res2 = (Fun1("a") && Fun2("b")) && (Fun1("c") || Fun2("d"));
    return res1 || res2;
}

輸出結果


a
c
d
a

逐步執行邏輯

  1. 計算 res1:
    • Fun1("a") 返回 0(假)→ 短路,Fun2("b") 不執行。
    • 左邊整體為假,繼續算右邊 Fun1("c") || Fun2("d")。
    • Fun1("c") 返回 0 → 需算 Fun2("d"),返回 1 → 右邊為真。
    • 輸出順序:a、c、d。
  2. 計算 res2:
    • Fun1("a") 返回 0 → 短路,Fun2("b") 不執行。
    • 左邊為假,&& 整體必假 → 右邊 完全不執行。
    • 輸出:a。

關鍵知識點:C/C++ 邏輯運算左到右順序計算,且具備短路特性(&& 遇假停、|| 遇真停)。


題目三:sizeof 對數組、指針、函數參數的不同行為

代碼

[cpp]
int SizeOf(char pString[]) { return sizeof(pString); }

int main() {
    char *pString1 = "google";
    int size1 = sizeof(pString1);   // 指針大小
    int size2 = sizeof(*pString1);  // 指向類型大小

    char pString2[100] = "google";
    int size3 = sizeof(pString2);   // 整個數組大小
    int size4 = SizeOf(pString2);   // 傳入函數退化為指針

    printf("%d, %d, %d, %d", size1, size2, size3, size4);
    return 0;
}

輸出結果(32位系統)

4, 1, 100, 4

詳細解析

表達式結果原因
sizeof(pString1)4指針變量本身,32位系統佔 4 字節
sizeof(*pString1)1解引用得到 char,佔 1 字節
sizeof(pString2)100數組在定義處保留完整類型信息,含 100 個 char
SizeOf(pString2)4數組作函數參數退化為指針,sizeof 測得指針大小

避坑指南:在函數內無法通過 sizeof 獲取傳入數組的長度,必須額外傳遞長度參數或使用哨兵值(如字符串的 \0)。

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