本文共 1055 字,大约阅读时间需要 3 分钟。
上次讲到,如果在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++的伙伴可以一起学习!”
关注我,带你遨游代码世界!
下面这些是C/C++能做的 :
服务器开发工程师、人工智能、云计算工程师、信息安全(白客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等!
转载地址:https://blog.csdn.net/weixin_32503531/article/details/112536381 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!