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

C 語言啟動向量呼叫技巧:(*(void(*)())0)() 完整解析

     編輯:關於C語言

程式碼來源

出自《C 陷阱與缺陷》,描述電腦開機後硬體從位址 0 讀取啟動向量並跳轉執行的情境。

逐層拆解

  1. fp 是函數指標,*fp 解參考得函數,(*fp)() 呼叫之。
  2. 欲呼叫位址 0 的函數,直覺寫 (*0)(),但 * 運算元必須是指標型別。
  3. 需將整數 0 強制轉型為函數指標型別:(void (*)())0 ——「指向無參無回傳函數的指標,值為 0」。
  4. 完整呼叫式:(*(void (*())())0)()。

更清晰的 typedef 寫法

typedef void (*func_ptr)();  // 定義函數指標型別
(*(func_ptr)0)();            // 使用型別別名轉型並呼叫

實務意義

  • 嵌入式啟動程式碼常在向量表(位址 0)放置 Reset Handler 位址。
  • 單元測試中模擬硬體中斷向量跳轉。
  • 展示 C 指標型別系統的表達能力:任意整數均可轉型為函數指標並呼叫(行為屬實作定義/未定義,需硬體配合)。

現代替代方案

  • 向量表定義為 void (*const vector_table[])(void) = { Reset_Handler, ... };,編譯器自動配置區段屬性。
  • 使用編譯器屬性 __attribute__((section(".vectors"))) 定位。
  • 避免在應用層直接硬編碼位址 0 呼叫,改由啟動檔/連結腳本處理。

理解此技巧有助於閱讀底層啟動代碼、編寫裝置驅動向量表、除錯硬體異常入口。

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