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.pswp.cn/news/529802.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529802.shtml
英文地址,請注明出處:http://en.pswp.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…