2015-02-08 69 views
0

我想參考以下與我的問題相關的代碼。C命令行參數 - argv char數組在哪裏?

#include <stdio.h> 
int main(int argc, char *argv[]) {   
    printf("%c\n", argv[1][1]);     
    return 0; 
} 

通常在創建指針之前,必須首先存在變量。但是在C命令行參數中,*argv[]不參考已定義的char argv,但它實際上是一個二維數組,它不僅包含地址,還包含命令行參數的元素。這怎麼可能發生。我很欣賞背後的理論。

我的第二個問題是,指針數組怎麼能包含命令行參數的元素?

+3

這是通過操作系統和C運行時庫的啓動代碼來完成。 – Barmar 2015-02-08 07:13:43

+2

另外,考慮一個函數必須被調用才能執行 - 但是誰調用了你的'main()'?魔法!至於「指針數組怎樣才能包含命令行參數的元素」 - 由於命令行參數是字符串,並且在C中,字符串通常由指向其第一個字符的指針引用。 – 2015-02-08 07:18:39

+0

相關如果不是重複:http://stackoverflow.com/q/12332/694576 – alk 2015-02-08 09:27:06

回答

0

函數參數是變量聲明(例如int argc是主函數中的局部變量)。而argv []是存儲字符串地址的指針數組。由編譯器準備的用於調用主函數的代碼分配的指針和字符串的內存,因此只有一個int和一個指針被賦予main函數(argv和argc)的局部變量。

0

有一些實現相關的方式,啓動一個可執行文件並通過它從主機環境接收或檢索信息。對於C程序,該過程的一部分會導致命令行參數存儲在數組中。然後以某種方式調用main(),並給出argc和argv的適當值。這可以由主機系統本身完成(例如,操作系統設置,然後直接調用程序的main()),也可以在程序可執行開始執行後完成(例如,在啓動代碼程序可執行文件本身檢索命令行信息,將其打包,然後調用main())。

0

調用main()函數(這只是像任何其他功能)也建立並傳遞3個參數的C運行時庫:(argc, argv, envp) 這是建立在引導代碼開始運行的所有編譯的C程序;在main()被調用的時候,命令行已被讀取並被標記並由argv指向。

Argv不是二維的,是char *指向文本的一維數組;每個文本字符串已被複制到其自己存儲在別處的char數組中。

2

有一些代碼在main之前運行。其實這個代碼調用main函數。

這是什麼代碼? F.E.它啓動了諸如stdin,stdout,stderr等變量。它解析命令行並準備argv數組。

有關更多信息,請參閱http://en.wikipedia.org/wiki/Crt0

1

簡短的回答是:

1)操作系統傳遞新過程的argc,argv的[] ...和其他啓動參數

2)大多數C實現具有 「CRT0」 文庫在「main()」被執行之前執行的調用。 CRT0的一個工作是將OS程序加載器的argv []傳遞給C程序的「main()」。

以下是詳細信息:

http://wiki.osdev.org/Creating_a_C_Library

在C庫實現的第一個也是最重要的事情是 _start功能,其控制從程序加載器通過。它的任務是初始化和運行這個過程。正常情況下,通過初始化C庫(如果需要),然後調用全局構造函數 ,最後調用exit(main(argc,argv)),完成 。

...

the_start函數調用initialize_standard_library。請注意程序加載器寄存器的使用情況如何很好地符合x86_64 SysV調用 約定,以及initialize_standard_library(int argc,char * argv [],int envc,char * envp [])函數如何接受與 _start相同的參數。

另請參閱man execvp(3)