2)main函数在执行前和执行后有哪些操作

main函数执行之前,主要就是初始化系统相关资源:

? ? ?1. 设置栈指针

? ? ?2. 初始化static静态和global全局变量,即data段的内容

? ? ?3. 将未初始化部分的全局变量赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容 ? ??

? ? ?4. 全局对象初始化,在main之前调用构造函数

? ? ?5. 将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数

main函数执行之后:

? ? ?1. 全局对象的析构函数会在main函数之后执行;?

? ? ?2. 可以用_onexit 注册一个函数,它会在main 之后执行;?

如果你需要加入一段在main退出后执行的代码,可以使用onexit()函数,注册一个函数。?

?

? ? ? ? #include?<stdlib.h>
??????? #include?<stdio.h>
????
????????int?atexit(void?(*function")(void));
????????void?fn1(?void?), fn2(?void?), fn3(?void?);
?????????????????????????
????????int?main(?void?){
??????????? onexit( fn1 );
??????????? onexit( fn2 );
????????????printf(?"This is executed first."?);
??????? }
????????
????????void?fn1(){
????????????printf(?" This is"?);
??????? }
????????void?fn2(){
????????????printf(?" executed next."?);
??????? }

结果:

This is executed first.

This is executed next.?

?

时间: 2024-11-10 06:32:16

2)main函数在执行前和执行后有哪些操作的相关文章

android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明

android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如android提供的发短信或者打电话的Activity. Intent call = new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+phonenumber); startActivity(call); Intent sms = new Inte

HttpURLConnection在main函数中和tomcat启动后执行的区别

当有一个HttpURLConnection请求类时, 在用main函数调用能狗返回值,但是tomcat启动后,程序调用又返回值为空,如下: 如上图,在不知道别人方法怎么处理的情况下,我门的参数应该完全模拟前端 试一下如下方式 给中文参数加上URLEncoder.

多玩YY语音的面试题:C++中如何在main()函数之前执行操作?

第一反应main()函数是所有函数执行的开始.但是问题是main()函数执行之前如何执行呢? 联想到MFC里面的 C**App类的theApp对象,其执行顺序就在main函数之前.道理相通,顺理推下,能够想到:如果在main函数之前声明一个类的全局的对象.那么其执行顺序,根据全局对象的生存期和作用域,肯定先于main函数. 示例如下: class simpleClass { public: simpleClass( ) { cout << "simpleClass construct

从开机加电到执行main函数之前的过程

1.启动BIOS,准备实模式下中断向量表和中断服务程序 在按下电源按钮的瞬间,CPU硬件逻辑强制将CS:IP设置为0xFFFF:0x0000,指向内存地址的0xFFFF0位置,此位置属于BIOS的地址范围.关于硬件如何指向BIOS区,这是一个纯硬件动作,在RAM实地址空间中,属于BIOS地址空间部分为空,硬件只要见到CPU发出的地址属于BIOS地址范围,直接从硬件层次将访问重定向到BIOS的ROM区中.这也就是为什么RAM中存在空洞的原因. BIOS程序在内存最开始的位置(0x00000)用1K

windows平台中让函数在main函数之前执行的方法

1.将要执行的代码写到类的构造函数中,并定义对应的全局变量2.将要执行的代码写到TLS回调函数中在c/c++中,我们都知道main函数是程序开始执行的地方,但是在进行反调试的时候,很多时候都需要调试检测函数在main函数之前执行. 1.将要执行的代码写到类的构造函数中,并定义对应的全局变量在windows平台中,执行我们手写的main函数之前,系统会执行一段CRTstartup代码,对系统的堆栈.全局变量.命令行参数.环境变量等进行初始化操作.该方法就是利用windows在执行main函数之前先

C之main函数和命令行参数(三十)

我们知道在 C 语言中,程序是从 main 函数开始运行的,我们称其为主函数.我们来看看下面几种 main 函数定义正确吗? 那么 main 函数的原型到底是什么呢?我们来看看编译器怎么说,我们分别编译下四种 main 函数的形式,经过编译后,程序可以编译通过并且执行完成.那么最标准的 main 函数的原型是上面的第四种,main 函数是操作系统调用的函数,操作系统总是将 main 函数作为应用程序的开始并且将 main 函数的返回值作为应用程序的退出状态.那么 C 编译器为什么要支持这么多不同

一张图看从CreateProcess到main函数的过程

整体过程如下: 需要说明两点: 1.在XP中,新进程主线程的启动,会先执行一个用户态的APC,会执行ntdll!LdrInitializeThunk进行程序执行前的一些列初始化操作.其中很重要任务就是加载从Kernel32.dll开始的系统DLL.注意的是,这个APC的插入,根据WRK中的代码看来是在PspUserThreadStartup中进行的: 但实际调试XP SP3发现,该函数并未有这个动作.并且在进入这个函数的时候APC已经插入好了.于是追踪到在XP SP3中,该APC的插入时机是在n

main函数的本质

1.main函数是操作系统调用的函数 2.操作系统总是将main函数作为应用程序的开始 3.操作系统将main函数的返回值作为程序的退出状态 main函数的参数 程序执行时可以向main函数传递参数 int main() int main(int argc) int main(int argc,char* argv[]) int main(int argc,char* argv[],char* env[]) argc--命令行参数个数 argv--命令行参数数组 env--环境变量数组 gcc编

C语言的main函数到底该怎么写

前言 main函数是程序启动后执行的第一个自定义函数.从开始学习C语言到现在,我们似乎看到了很多个版本的main函数,那么哪一种才是正确的呢?我们先来看看目前有哪些版本. main函数版本 第一种,没有返回值,没有入参: main() 在C89标准中,这种写法是可以接受的,但使用现在的编译器编译时,会报告警,并且会将其返回值默认为int.实际上,如果函数没有显式声明返回类型,那么编译器会将返回值默认为int. 第二种,返回值为void,没有入参: void main() 这种形式的来源不得而知.