从零开始,学习windows编程(5)--修改入口不为mainCRTStartup
来源:互联网 发布:开淘宝网店怎么上货 编辑:程序博客网 时间:2024/05/01 02:29
上次讲到,如果在VC的console程序中,入口不为mainCRTStartup,会出现什么后果?
我们就先将入口设置为main函数。
2
3 int main()
4 {
5 printf("hello world\n");
6 return0;
7 }
先通过GUI来设置一下,创建一个win32 console Application。
代码还是差不多,打印字符串
编译链接运行,当然没问题。
修改入口,在”project”->”setting”出现的对话框中,Link选项中,在”Entry-point symbol”中输入main。即定义好入口为main函数。
Rebuild,编译链接,没有问题。
Deleting intermediate files and output files for project 'Hello - Win32 Debug'.
--------------------Configuration: Hello - Win32 Debug--------------------
Compiling...
main.cpp
Linking...Hello.exe - 0 error(s), 0 warning(s)
运行,出现问题。
来看一下到底是哪里出现了问题。
运行debug版本,切到出错部分。VC界面为:
不知道大家有没有看得清楚,我将call stack单独列在这里,也就是上图中标红线的部分。
NTDLL! 7c9100e8()
_heap_alloc_base(unsigned int 0x00001030) line 161
_heap_alloc_dbg(unsigned int 0x00001000, int 0x00000002, const char * 0x00420c1c `string', int 0x0000003b) line 367 + 9 bytes
_nh_malloc_dbg(unsigned int 0x00001000, int 0x00000000, int 0x00000002, const char * 0x00420c1c `string', int 0x0000003b) line 242 + 21 bytes
_malloc_dbg(unsigned int 0x00001000, int 0x00000002, const char * 0x00420c1c `string', int 0x0000003b) line 163 + 27 bytes
_getbuf(_iobuf * 0x00422a58) line 59 + 19 bytes
_flsbuf(int 0x00000068, _iobuf * 0x00422a58) line 153 + 9 bytes
write_char(int 0x00000068, _iobuf * 0x00422a58, int * 0x0012fd10) line 1083 + 75 bytes
_output(_iobuf * 0x00422a58, const char * 0x0042001d, char * 0x0012ff74) line 393 + 21 bytes
printf(const char * 0x0042001c `string') line 60 + 18 bytes
main() line 5 + 10 bytes
KERNEL32! 7c817077()
可以看到,出错部分是在NTDLL中的某个汇编代码中,但是根源是在printf,printf调用到这部分的时候,结果在_heap_alloc_base的时候出错了,_heap_alloc_base从字面意义上面就可以看出是在堆上分配内存的。
从上面一章,我们又可以得到mainCRTStartup函数在main函数之前调用,其中做了很多初始化工作,其中有一个函数调用叫做_heap_init,是用来创建和初始化CRT堆。而如果直接用main来做入口的话,则没有做这些init工作。
刚刚是通过GUI来创建的,而通过命令行,前面cl编译是一样的,link的时候使用
2 Microsoft (R) Incremental Linker Version 6.00.8168
3 Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
同样的效果。
另外,如果不用main,用另外一个函数,比如myentry,会出现什么情况呢?你可以先试试,下一篇来具体说明一下~
- 从零开始,学习windows编程(5)--修改入口不为mainCRTStartup
- 从零开始,学习windows编程(7)--不使用CRT库的程序
- 从零开始,学习windows编程(8)--自己动手,编译CRT
- 从零开始,学习windows编程(8)--自己动手,编译CRT
- mainCRTStartup
- mainCRTStartup
- 从零开始,学习windows编程(9)-- 字符编码以及国际化(1)
- 从零开始,学习windows编程(3)—hello.c的疑惑
- 从零开始,学习windows编程(3)—hello.c的疑惑
- 从零开始,学习windows编程外篇(1)--分析lib文件
- 从零开始,学习windows编程(4)--从libc.lib开始
- 从零开始学习Kinect编程(一) 4.20
- CGI编程学习(自助终端的入口)
- Windows上编程的入口点函数
- 从零开始学习编程语言-Python
- 从零开始搭建自己的mvc(一)入口文件
- 从零开始,重新学习windows编程(2)--环境准备,不用IDE编写程序
- 从零开始,重新学习windows编程(2)--环境准备,不用IDE编写程序
- web.xml中welcome-file配置的问题
- 【开源工具】Cppcheck 1.54 C/C++静态代码分析工具
- 从零开始,学习windows编程(3)—hello.c的疑惑
- HDU 2815 Mod Tree 解a^x = b(mod n)非互质
- 从零开始,学习windows编程(4)--从libc.lib开始
- 从零开始,学习windows编程(5)--修改入口不为mainCRTStartup
- 从零开始,学习windows编程(6)--改换entry,link错误的简单分析
- 从零开始,学习windows编程外篇(1)--分析lib文件
- C程序小结3
- Hibernate双向1-N关联的简单示例
- iphone 重用机制
- 人不成熟的六大特征
- 从零开始,学习windows编程(7)--不使用CRT库的程序
- malloc/free/堆、栈的知识点归纳