從零開始,學習windows編程 - 修改入口不為mainCRTStartup

虎牙來了 發佈 2019-12-29T11:03:03+00:00

上次講到,如果在VC的console程序中,入口不為mainCRTStartup,會出現什麼後果?我們就先將入口設置為main函數。 先通過GUI來設置一下,創建一個win32 console Application。 代碼還是差不多,列印字符串;編譯連結運行,當然沒問題。

上次講到,如果在VC的console程序中,入口不為mainCRTStartup,會出現什麼後果?

我們就先將入口設置為main函數。

先通過GUI來設置一下,創建一個win32 console Application。

代碼還是差不多,列印字符串;編譯連結運行,當然沒問題。

修改入口,在「project」->「setting」出現的對話框中,Link選項中,在「Entry-point symbol」中輸入main。即定義好入口為main函數。

Rebuild,編譯連結,沒有問題。

運行,出現問題 > > >

來看一下到底是哪裡出現了問題。運行debug版本,切到出錯部分。VC介面為:

不知道大家有沒有看得清楚,我將call stack單獨列在這裡,也就是上圖中標紅線的部分。

可以看到,出錯部分是在NTDLL中的某個彙編代碼中,但是根源是在printf,printf調用到這部分的時候,結果在_heap_alloc_base的時候出錯了,_heap_alloc_base從字面意義上面就可以看出是在堆上分配內存的。

從上面一章,我們又可以得到mainCRTStartup函數在main函數之前調用,其中做了很多初始化工作,其中有一個函數調用叫做_heap_init,是用來創建和初始化CRT堆。而如果直接用main來做入口的話,則沒有做這些init工作。

剛剛是通過GUI來創建的,而通過命令行,前面cl編譯是一樣的,link的時候使用

同樣的效果。

另外,如果不用main,用另外一個函數,比如myentry,會出現什麼情況呢?你可以先試試,後續來具體說明一下~

———————————————▁▂▃▅▆▇▉

我是一名從事了10年開發在退休邊緣垂死掙扎的高齡程式設計師,最近我花了一些時間整理了一個完整的學習C語言、C++的路線,項目源碼和工具。對於想學習C/C++的小夥伴而言,學習的氛圍和志同道合的夥伴很重要,筆者推薦一個C語言/C++編程愛好者的聚集地,私信我【編程學習】即可!

歡迎初學和進階中的小夥伴。希望你也能憑自己的努力,成為下一個優秀的程式設計師。工作需要、感興趣、為了入行、轉行需要學習C/C++的夥伴可以一起學習!」

關注我,帶你遨遊代碼世界!

下面這些是C/C++能做的 :

伺服器開發工程師、人工智慧、雲計算工程師、信息安全(白客)、大數據 、數據平台、嵌入式工程師、流媒體伺服器、數據控解、圖像處理、音頻視頻開發工程師、遊戲伺服器、分布式系統、遊戲輔助等!


關鍵字: