C命令行参数 - argv char数组在哪里?

时间:2015-02-08 07:09:07

标签: c arrays

我想参考以下与我的问题相关的代码。

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

通常在创建指针之前,必须首先存在变量。但是在C命令行参数中,*argv[]不是指已定义的char argv,而是实际上是一个二维数组,它不仅包含地址,还包含命令行参数的元素。怎么会发生这种情况。我很欣赏这背后的理论。

我的第二个问题是指针数组如何包含命令行参数的元素?

6 个答案:

答案 0 :(得分:2)

有一些代码在main之前运行。实际上这段代码调用main函数。

这段代码是什么? F.E.它会启动stdinstdoutstderr等变量。它解析命令行并准备argv数组。

有关详细信息,请参阅http://en.wikipedia.org/wiki/Crt0

答案 1 :(得分:1)

简短的回答是:

1)操作系统将新进程传递给argc,argv [] ...和其他启动参数

2)大多数C实现都有一个&#34; CRT0&#34;在&#34; main()&#34;之前执行的库调用被执行。 CRT0的一项工作是将OS程序加载器中的argv []传递给C程序&#34; main()&#34;。

以下是更多详情:

  

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)

答案 2 :(得分:0)

函数参数是变量声明(例如,int argc是main函数中的局部变量)。而argv []是存储字符串地址的指针数组。由编译器调用以调用主函数的代码分配的指针和字符串的内存,因此只有一个int和一个指针被赋予main函数的局部变量(argv和argc)。

答案 3 :(得分:0)

有一些依赖于实现的方式,其中启动可执行文件,并通过该方式从主机环境接收或检索信息。对于C程序,该进程的一部分导致命令行参数存储在数组中。然后以某种方式调用main(),并给出适当的argc和argv值。

这可以由主机系统本身完成(例如操作系统设置,然后直接调用程序的main())或者可以在程序可执行程序开始执行后完成(例如,启动程序可执行文件本身的代码,它检索命令行信息,将其打包,然后调用main())。

答案 4 :(得分:0)

调用main()函数的C运行时库(它只是一个与其他函数一样的函数)也设置并传入3个参数:(argc, argv, envp) 这内置于开始运行所有已编译的C程序的引导代码中;在调用main()时,命令行已被读取并标记化并由argv指向。

Argv不是二维的,是一个char *指向文本的一维数组;每个文本字符串都已复制到其他地方存储的char数组中。

答案 5 :(得分:0)

当系统(OS和标准库)通过调用函数main(您必须提供)启动程序时,它会设置一个包含指向命令行参数字符串的指针的数组。 main将使用两个参数调用:命令行参数的数量和数组本身。

参考:https://www.gnu.org/software/libc/manual/html_node/Program-Arguments.html