我想参考以下与我的问题相关的代码。
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("%c\n", argv[1][1]);
return 0;
}
通常在创建指针之前,必须首先存在变量。但是在C命令行参数中,*argv[]
不是指已定义的char argv
,而是实际上是一个二维数组,它不仅包含地址,还包含命令行参数的元素。怎么会发生这种情况。我很欣赏这背后的理论。
我的第二个问题是指针数组如何包含命令行参数的元素?
答案 0 :(得分:2)
有一些代码在main
之前运行。实际上这段代码调用main
函数。
这段代码是什么? F.E.它会启动stdin
,stdout
,stderr
等变量。它解析命令行并准备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。
答案 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