上次講到,如果在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++能做的 :
伺服器開發工程師、人工智慧、雲計算工程師、信息安全(白客)、大數據 、數據平台、嵌入式工程師、流媒體伺服器、數據控解、圖像處理、音頻視頻開發工程師、遊戲伺服器、分布式系統、遊戲輔助等!