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

Windows 程式設計入門(五):自訂入口點導致的執行期崩潰分析

     編輯:關於C語言

實驗:將入口點強制設為 main

在 VC6 專案屬性 → Link →「Entry-point symbol」填入 main,或命令列 link /entry:main hello.obj。編譯連結均成功,但執行時崩潰:

建立 Console 專案 設定 Entry-point 為 main 執行崩潰錯誤視窗 Call Stack 詳細資訊

Call Stack 深度解析

NTDLL! 7c9100e8()
_heap_alloc_base(unsigned int 0x00001030) line 161
_heap_alloc_dbg(...) line 367
_nh_malloc_dbg(...) line 242
_malloc_dbg(...) line 163
_getbuf(_iobuf * 0x00422a58) line 59
_flsbuf(int 0x00000068, _iobuf * 0x00422a58) line 153
write_char(...) line 1083
_output(...) line 393
printf(...) line 60
main() line 5
KERNEL32! 7c817077()

崩潰發生於 NTDLL 內部的堆積配置常式 _heap_alloc_base,根因是 printf 需要緩衝區,呼叫 _getbuf → _flsbuf → _malloc_dbg 分配記憶體,但 CRT 堆積尚未初始化(_heap_init 未被呼叫)。

核心結論

  • mainCRTStartup 執行了關鍵初始化:_heap_init(建立 CRT 堆積)、_ioinit(初始化標準串流)、命令列/環境變數解析、atexit 登錄等。
  • 直接跳轉 main 會略過所有初始化,導致任何使用 CRT 資源(堆積、I/O、區域設定、Thread Local Storage)的函式在執行期失敗。
  • 同理,若入口設為自訂函式 myentry 且未手動執行初始化,結果相同。

下一步預告

下一篇將探討:若入口設為不存在的函式(如 myentry),連結器會如何報錯?以及如何正確實作「無 CRT 依賴」的最小程式。

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