聊聊main函數(shù)

今天突然想總結(jié)一下main這個被人們熟視無睹的函數(shù)。之所以總結(jié)它,是因為我覺得自己還沒有完全了解它的方方面面。

文件main.c中鍵入如下代碼

int main(int argc, char* argv[])
{
    return 0;
}
兩個參數(shù):

int argc :代表main函數(shù)的參數(shù)個數(shù)。有意思的是,main函數(shù)至少有一個參數(shù),就是可執(zhí)行文件名及其所在路徑組成的字符串。
char argv[]*:該數(shù)組的每個元素為一個字符串,對應(yīng)一個參數(shù)。argv[0]一定是可執(zhí)行文件名及其所在路徑組成的字符串。

可以通過下面的代碼的輸出說明這一點:

int main(int argc, char* argv[])
{
    for(int i = 0; i < argc; i++)
    {
        printf("argv[%d] = %s\n", i, argv[i]);
    }

    return 0;
}
gcc main.cpp -o main
./main

輸出:
argv[0] = ./main

可以看出,在執(zhí)行二進(jìn)制文件main時,雖然沒有輸入任何參數(shù),但仍然輸出了可執(zhí)行文件的路徑以及文件名。

因為我們是在當(dāng)前路徑下執(zhí)行該二進(jìn)制文件,所以路徑名稱只有./。如果我們把可執(zhí)行文件放入test的文件夾中你,在test文件夾同級目錄下執(zhí)行main,輸出如下:

./test/main

輸出:
argv[0] = ./test/main

好,說完了第一個參數(shù),我們看看其它參數(shù),那就很簡單了,以空格分開,逐一輸入多個字符串即可(注意,輸入的參數(shù)無論是數(shù)字還是字符,統(tǒng)統(tǒng)被當(dāng)作字符串處理)??纯聪旅娴妮敵觥?/p>

./main hello world

輸出:
argv[0] = ./main
argv[1] = hello
argv[2] = world

最多能輸入多少參數(shù)?

既然可執(zhí)行文件后可以輸入?yún)?shù),肯定是有個數(shù)限制的,那最多能輸入多少參數(shù)呢?有人說5000個字符,有人說8000個字符,不同操作系統(tǒng),不同編譯環(huán)境可能不一樣,這里不去驗證這個值具體是多少,一般我們也很難輸入那么多參數(shù)給main

一個有意思的問題是,main函數(shù)的第二個參數(shù)是一個指針數(shù)組,指針是否有可能為空?數(shù)組是否會越界?
第一個問題:我們沒有辦法輸入一個空指針給main函數(shù),空字串也不代表是空指針,況且main函數(shù)會忽略參數(shù)中的多余的空格(除了用于分割兩個字符串的那個空格)。所以第一個問題不是問題。
我們看第二個問題:

int main(int argc, char* argv[])
{
    printf("argv[100000] = %s\n",argv[100000]);
    return 0;
}

執(zhí)行上述代碼的程序會提示段錯誤??梢娨呀?jīng)越界了。也就是說main函數(shù)的數(shù)組入?yún)⑹强赡茉浇绲?。一個正確的做法是在取argv中的值時,一定要用argc做邊界保護(hù)。

番外篇

main函數(shù)是不是一個程序執(zhí)行的第一個函數(shù)?答案是否定的。真正的入口函數(shù)是一個叫_start的函數(shù)(不同操作系統(tǒng)可能名字不同)。可以通過下面實驗說明確實存在_start這個函數(shù):

gcc main.cpp -nostdlib -o main

輸出:
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400144

結(jié)束

就到這里吧,不足之處請指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容