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

C/C++ 面試必考:sizeof 操作元為陣列參數與 malloc 指標時的大小計算

     編輯:關於C語言

題目

void Func(char str[100]) {
    sizeof(str) = ?  // ①
}
void *p = malloc(100);
sizeof(p) = ?        // ②

答案

① 4 (32 位系統) / 8 (64 位系統)
② 4 (32 位系統) / 8 (64 位系統)

核心解析:陣列名在三種語境下的本質

語境陣列名代表sizeof 結果可修改?
定義處 char str[100];資料結構本身 (char[100])100否 (常量指標)
sizeof(str) / &str資料結構本身整個陣列大小否
函式參數 Func(char str[100])退化為 普通指標 (char*)指標大小 (4/8)是 (可 ++、--、賦值)
其他表達式轉換為指向首元素指標 (char*)指標大小否

malloc 回傳指標

malloc 回傳 void*,賦值給 void *p。sizeof(p) 為指標變數本身大小,與分配記憶體大小無關。

平台差異

  • Windows 32 位 / Linux 32 位:指標 4 位元組。
  • Linux 64 位 / Windows 64 位:指標 8 位元組。

面試加分點

  • 說明「退化」發生在編譯期,函式內完全失去陣列長度資訊。
  • 若需在函式內得知長度,必須額外傳遞 size_t len 參數。
  • sizeof 是編譯期運算子,非函式,不產生機器碼(VLA 例外)。

總結

sizeof(陣列參數) = 指標大小;sizeof(malloc指標) = 指標大小。牢記「陣列名作參數退化為指標」鐵律,即可秒殺此類面試題。

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