c语言程序执行完main函数后,一个c程序在执行main函数之前和main之后都做了那些事情啊该如何解决...

当前位置:我的异常网» C语言 » 一个c程序在执行main函数之前和main之后都做了那些

一个c程序在执行main函数之前和main之后都做了那些事情啊该如何解决

www.myexceptions.net  网友分享于:2013-04-17  浏览:19次

一个c程序在执行main函数之前和main之后都做了那些事情啊?

很想知道

一个c程序在执行main函数之前和main之后都做了那些事情?

请高手指点指点哈~

------解决方案--------------------

main函数之前--真正的函数执行入口或开始

一种解释

实际上,在可执行文件被加载之后,控制权立即交给由编译器插入的Start函数,它将对后面这些全局变量进行准备:

_osver 操作系统的构件编号

_winmajor 操作系统的主版本号

_winminor 操作系统的次版本号

_winver 操作系统完全版本号

__argc 命令行参数个数

__argv 指向参数字符串的指针数组

_environ 指向环境变量字符串的指针数组

Start函数初始化堆并调用main函数.mian函数返回之后,Start函数调用Exit函数结束该进程.

启动函数Start的源代码在:

crt0.c Microsoft Visual C++

c0w.asm Borladn C++

另一种解释

Some of the stuff that has to happen before main():

set up initial stack pointer

initialize static and global data

zero out uninitialized data

run global constructors

Some of this comes with the runtime library's crt0.o file or its __start() function. Some of it you need to do yourself.

Crt0 is a synonym for the C runtime library.

Depending on the system you're using the follwing may be incomplete, but it should give you an idea. Using newlib-1.9.0/libgloss/m68k/crt0.S as an outline, the steps are:

1. Set stack pointer to value of __STACK if set

2. Set the initial value of the frame pointer

3. Clear .bss (where all the values that start at zero go)

4. Call indirect of hardware_init_hook if set to initialize hardware

5. Call indirect of software_init_hook if set to initialize software

6. Add __do_global_dtors and __FINI_SECTION__ to the atexit function so destructors and other cleanup functions are called when the program exits by either returning from main, or calling exit

7. setup the paramters for argc, argv, argp and call main

8. call exit if main returns

第三种解释:囫囵C语言(三):谁调用了我的 main?

现在最重要的是要跟得上潮流,所以套用比较时髦的话,谁动了我的奶酪。谁调用了我的 main?不过作为计算机工作者,我劝大家还是不要赶时髦,今天Java热,明天 .net 流行,什么时髦就学什么。我的意思是先花几年把基本功学好,等你赶时髦的时候也好事半功倍。废话不多说了。

我们都听说过一句话:“main是C语言的入口”。我至今不明白为什么这么说。就好像如果有人说:“挣钱是泡妞”,肯定无数砖头拍过来。这句话应该是“挣钱是泡妞的一个条件,只不过这个条件特别重要”。那么上面那句话应该是 “main是C语言中一个符号,只不过这个符号比较特别。”

我们看下面的例子:

/* file name test00.c */

int main(int argc, char* argv)

{

return 0;

}

编译链接它:

cc test00.c -o test.exe

会生成 test.exe

但是我们加上这个选项: -nostdlib (不链接标准库)

cc test00.c -nostdlib -o test.exe

链接器会报错:

undefined symbol: __start

也就是说:

1. 编译器缺省是找 __start 符号,而不是 main

2. __start 这个符号是程序的起始点

3. main 是被标准库调用的一个符号

再来思考一个问题:

我们写程序,比如一个模块,通常要有 initialize 和 de-initialize,但是我们写 C 程序的时候为什么有些模块没有这两个过程么呢?比如我们程序从 main 开始就可以 malloc,free,但是我们在 main 里面却没有初始化堆。再比如在 main 里面可以直接 printf,可是我们并没有打开标准输出文件啊。(不知道什么是 stdin,stdout,stderr 以及 printf 和 stdout 关系的群众请先看看 C 语言中文件的概念)。

有人说,这些东西不需要初始化。如果您真得这么想,请您不要再往下看了,我个人认为计算机软件不适合您。

聪明的人民群众会想,一定是在 main 之前干了些什么。使这些函数可以直接调用而不用初始化。通常,我们会在编译器的环境中找到一个名字类似于 crt0.o 的文件,这个文件中包含了我们刚才所说的 __start 符号。(crt 大概是 C Runtime 的缩写,请大家帮助确认一下。)

那么真正的 crt0.s 是什么样子呢?下面我们给出部分伪代码:

///

section .text:

__start:

:

init stack;

init heap;

open stdin;

open stdout;

open stderr;

:

push argv;

push argc;

call _main; (调用 main)

:

destory heap;

close stdin;

close stdout;

close stderr;

:

call __exit;

实际上可能还有很多初始化工作,因为都是和操作系统相关的,笔者就不一一列出了。

注意:

1. 不同的编译器,不一定缺省得符号都是 __start。

2. 汇编里面的 _main 就是 C 语言里面的 main,是因为汇编器和C编译器对符号的命名有差异(通常是差一个下划线'_')。

文章评论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言stm32串口控制单片机,实用STM32的串口控制平台的实现

假设我要编写一个自己的指令脚本, 来读取MCU的关键信息,关键字为mcu, 文件命名为shell_mcu.c; 当输入“mcu rd 0”时显示MCU的FLASH大小,输入“mcu rd 1”时读取MCU的唯一ID信息。shell_mcu.c源代码:/*****…

time_t c语言 2038,什么是2038问题?

什么是2038问题不知道你有没有听过2038问题?无论你是否听过,本文将带你认识什么是2038问题。Unix时间戳定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。而在C语言中,常用time_t来表示。举个例子…

C语言精度控制整形,C语言 凑算式 控制精度问题

想问一下,if语句中为什么写上*1.0之后,输出的就是对的个数29,但把*1.0删掉后,输出的个数就远大于29了?还想讨教一下各位高手,除了这种暴力求法,还有其他的比较好的方法吗?非常感谢/*…

c语言 l l next,nexttowardl

在头文件中定义float nextafterf( float from, float to );(1)(since C99)double nextafter( double from, double to );(2)(since C99)long double nextafterl( long double from, long double to );(3)(since C99)float nexttowardf( float from, long doub…

c 语言 readline,如何用C实现一个readLine()函数- 该函数每次读入文本文件的一行并打印到屏幕...

如何用C实现一个readLine()函数- 该函数每次读入文本文件的一行并打印到屏幕(2012-04-13 00:23:41)标签:打印文本文件如何杂谈如何用C实现一个readLine()函数? 该函数每次读入文本文件的一行并打印到屏幕以前看到过这方面的讨论http://bbs.chinaunix.net/viewthrea…

STC单片机C语言中的数据类型,stc单片机c语言程序设计 第9章 stc单片机c语言数据类型.pdf...

STC单片 机C语言变量和数据类型主讲:何宾Email :hebinmail.buct.edu.cn2016.03C语言中的常量和变量对于基本数据类型,按其值是否可变又分为常量和变量两种。在程序执行过程中,其值不发生改变的量称为常量,其值可变的量…

c4droid语言游戏,c4droid手机编程软件下载

c4droid可以说是手机端最好的编程软件,没有之一,软件可以帮助大家在手机上进行编写C代码,让各位程序员们随时随地都能编程。操纵简单,功能强大。c4droid软件介绍c4droid是款Android设备上的C/C程序编译器,默认以tcc(tiny c compil…

c语言图像函数怎么用,请教 怎么才能用C输出一个函数的图像?大侠 帮帮忙啊...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼发一下我当年的练习程序#include#include#include#includedouble exp(double x){double l,m;unsigned int n;l1; m1; n0;do {n;mx*m/n;llm; }while ((-1.0E-6<m)&&(m<1.0E-6));return l; }main(){int graphmode, gra…

创业冲突的五种解决方法是_不会说话,不懂处理人际冲突怎么办?《沟通的艺术》5步教会你...

关注“夏娃蓝空间”&#xff0c;陪你成长为更好的自己。想要良好地解决冲突&#xff0c;一定要有“这是我们两个人共同的事”的态度。今年夏天最热门的电视剧非《三十而已》莫属了&#xff0c;而撑起了这部剧的流量的广大观众&#xff0c;基本都是集中在逐步靠近中青年阶段的90…

android gsensor 坐标,MTK Android G sensor 原理,配置,调试

原理图&#xff1a;g_sensor的驱动目录在mediatek/custom/common/kernel/accelerometer下。一、g_sensor 的移植步骤1、在ProjectConfig.mk中配置相关的g_sensor例如 CUSTOM_KERNEL_ACCELEROMETER kxtf92、在mediatek/custom/common/kernel/accelerometer目录中添加 g_sensor的…

网贷大数据什么时候会好_如果人类把地球钻穿了,会发生什么?大数据分析告诉你多可怕...

很多科研人员在做实验的时候&#xff0c;少不了被旁人嘲笑或者蔑视的情况&#xff0c;因为常人往往是无法理解他们的想法的。例如曾经就有科研人员想要对地球进行钻探&#xff0c;看看能够在地表上钻多深&#xff0c;是否能够将地球给钻穿了。很多人都会认为这种做法没有意义而…

android h5 有广告,那些H5在Android上显示的丧心病狂的坑

首先得强调一下&#xff0c;H5和移动设备的交互遇到的问题真的是各种丧心病狂&#xff01;&#xff01;但是本主依然还是耐着极大的兴致(无奈)的做了下去。H5页面在Android或者IOS上运行出现问题(这里的运行指的是h5的页面运行在App里的webview里)&#xff0c;测试人员或者上级…

python非贪婪匹配_Python中关于正则表达式非贪婪以及多行匹配功能详解

这篇文章主要介绍了Python正则表达式非贪婪、多行匹配功能,结合实例形式分析了Python正则表达式中非贪婪及多行匹配功能的实现方法与相关注意事项,需要的朋友可以参考下本文实例讲述了Python正则表达式非贪婪、多行匹配功能。分享给大家供大家参考&#xff0c;具体如下&#xf…

小米9android q测试版,基于Android Q的MIUI来了 小米9尝鲜

01基于Android Q的MIUI来了中关村在线消息&#xff1a;谷歌在今年五月份发布了最新的Android Q系统&#xff0c;虽然很多国产手机还没有升级到Android P&#xff0c;但是还是有不少厂家开始对旗下的手机升级到最新的Android Q系统&#xff0c;根据小米最新的官方的消息&#xf…

ios传值给js_WKWebView JS与OC间相互传值调用

写在前面本文将介绍如何使用WKWebView进行JS与OC、OC与JS间的传值和方法调用。前置条件1、导入WebKit.framework2、声明WKWebViewJS调用OC原生方法1、前端在js文件中实现这里要注意messageHandlers后面跟着的deviceInfo要与原生的定义的一致。2、iOS 实现WKScriptMessageHandle…

android layerlist bitmap,android shape类似的 另一个 高端用法:layer-list

android shape类似的 另一个 高端用法&#xff1a;layer-list&#xff1a;简介&#xff1a;将多个图片或上面两种效果按照顺序层叠起来” 《?xml version"1.0" encoding"utf-8"?>《layer-listxmlns:android"http://schemas.android.com/apk/res/…

跨域会报40几_总结一下跨域的几种情况

在网站开发中&#xff0c;经常会遇到跨域问题&#xff0c;下面总结一下集中常见的跨域问题。1. 不同域名属于跨域&#xff0c;如&#xff1a;www.a.com 和www.b.com&#xff0c;另外www.a.com 和www.a.com.cn也属于不同域名。2. 主域名和子域名(二级域名、三级域名等)跨域&…

android将拍摄的图片存入sd卡中,Android将图片保存至SD卡上

首先判断SD卡是否插入-->public String getSDPath(){File SDdirnull;boolean sdCardExistEnvironment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);if(sdCardExist){SDdirEnvironment.getExternalStorageDirectory();}if(SDdir!null){return S…

nedc和epa续航里程什么意思_400公里已成续航新起点,纯电动车的实用性到底怎样...

对于购买纯电动汽车的用户来说&#xff0c;续航里程是非常重要的参考因素&#xff0c;毕竟如果续航里程太短&#xff0c;实用性将会大打折扣&#xff0c;跑个长途都心惊胆战的&#xff0c;生怕路上遇到堵车了、没电了、中途没有加油站之类的。就算是不考虑长途&#xff0c;市区…

android广播示例,android接受开机广播事件

【实例简介】【实例截图】【核心代码】package com.yin.servicetest;import com.yin.service.MyService;import android.app.ActivityManager;import android.app.ActivityManager.RunningServiceInfo;import android.content.BroadcastReceiver;import android.content.Contex…