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

C語言基礎面試題詳解:sizeof、malloc、strcmp 與基本類型大小

     編輯:C 語言問答

題目回顧

sizeof、malloc、strcmp 是執行什麼的
long char float 占幾個字節

逐項深度解析

1. sizeof — 編譯期運算符(非函數)

  • 功能:獲取**類型或表達式在內存中佔用的字節數**(類型為 size_t)。
  • 特點:**編譯期計算**(除 VLA 外),不產生運行時代碼,零開銷。
  • 用法:
    • sizeof(int) — 類型需加括號
    • sizeof a — 變量/表達式可不加括號
    • sizeof arr — 數組名**不退化**,得整個數組大小(區別 sizeof(ptr) 得指針大小)
  • 經典面試陷阱:
    
        void func(int arr[10]) { printf("%zu\n", sizeof(arr)); } // 輸出 8 (指針大小),非 40!
        int main() { int a[10]; printf("%zu\n", sizeof(a)); func(a); } // 輸出 40
        

2. malloc — 動態內存分配函數 (<stdlib.h>)

  • 原型:void *malloc(size_t size);
  • 功能:在**堆**上分配 size 字節**未初始化**內存,返回起始地址(void*,隱式轉換為任意指針類型)。
  • 失敗返回:NULL,**必須檢查**!
  • 配對釋放:free(ptr);,釋放後指針置 NULL 防野指針。
  • 常見錯誤:忘記 stdlib.h 導致隱式聲明返回 int 截斷地址(64位崩潰);malloc(strlen(s)) 忘記 +1 存 \0;釋放非堆地址/重複釋放。

3. strcmp — 字符串比較函數 (<string.h>)

  • 原型:int strcmp(const char *s1, const char *s2);
  • 功能:按**字典序**(ASCII 碼值)比較兩個以 \0 結尾的字符串。
  • 返回值:
    • < 0:s1 < s2 (首個不同字符 s1[i] < s2[i])
    • == 0:s1 == s2 (完全相同)
    • > 0:s1 > s2
  • 注意:比較的是**字符編碼值**,非長度;區分大小寫('A'=65 < 'a'=97);需比較長度用 strlen,忽略大小寫用 strcasecmp (POSIX) 或自寫。

基本類型大小(視實現定義,下表為主流 64 位 Linux/Windows/macOS)

類型典型大小 (字節)備註
char / signed char / unsigned char1標準保證 sizeof(char) == 1,CHAR_BIT >= 8
short / short int2至少 16 位
int4至少 16 位,通常 32 位
long / long int4 (Windows 64) / 8 (Linux/macOS 64)**LP64 vs LLP64 模型差異**!至少 32 位
long long8至少 64 位 (C99)
float4IEEE 754 single precision
double8IEEE 754 double precision
long double8/10/16實現相關,x86 常 10 字節 (80位擴展精度)
指針 void*8 (64位) / 4 (32位)與地址總線寬度匹配

關鍵差異:LP64 (Linux/macOS) vs LLP64 (Windows)

  • LP64:long 和指針 64 位 (8 字節),int 32 位。
  • LLP64:long long 和指針 64 位,**long 保持 32 位 (4 字節)** 兼容舊代碼。
  • **可移植代碼必用 <stdint.h> 精確類型**:int32_t, int64_t, intptr_t 等。

面試加分回答模板

sizeof 是編譯期運算符得類型/對象大小,數組名不退化;malloc 堆上分配未初始化內存,需檢查 NULL 配對 free;strcmp 字典序比較字符串返回負/零/正。基本類型大小依實現:char=1、short=2、int=4、float=4、double=8、long 4/8 視 LP64/LLP64、**指針 4/8**,可移植代碼用 stdint.h 精確類型。

總結

這三個是 C 語言**核心工具鏈**:sizeof 靜態知大小、malloc 動態要空間、strcmp 運行時比字符串。基本類型大小**無統一標準值**,只知道「下限」與「常見實現」,**可移植代碼堅決用 stdint.h**。面試時能說清 long 在 Windows/Linux 差異、sizeof 數組不退化、malloc 必檢 NULL、strcmp 返回值語義,即為扎實基礎。

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