Chinaunix

标题: main函数参数请教 [打印本页]

作者: likec    时间: 2003-05-28 11:52
标题: main函数参数请教
main(int argc,char *argv[],char **environ)
函数中,传给main的参数的个数有没有限制?
若有,是多少?
若无,那argv的地址如何分配用来装参数?
比如,我们自己写的程序里
my_fun(int n,char *v[])
{
   .......
   v=(char *)malloc(size);/*需要先分配空间才能写,可是main中不需要*/
   ......
}
作者: 蓝色键盘    时间: 2003-05-28 12:58
标题: main函数参数请教
标准C规定是两个参数,但是大多数的unix系统提供了三个参数,第三个参数用来向调用main函数的例程(一般的是一个shell例程exec)传递环境变量表。

在程序设计中,如果没有指定第三个参数,可以用getenv等函数存取或修改部分环境表中的变量。

一般的在系统头文件中已经将环境表神明为如下,因此在程序中使用不会提示没有引用的错误信息。
extern char **_environ;
作者: likec    时间: 2003-05-28 13:02
标题: main函数参数请教
原帖由 "蓝色键盘" 发表:
标准C规定是两个参数,但是大多数的unix系统提供了三个参数,第三个参数用来向调用main函数的例程(一般的是一个shell例程exec)传递环境变量表。

在程序设计中,如果没有指定第三个参数,可以用getenv等函数存取..........


谢谢斑竹关于第三个参数的说明。
我问的还有就是argv分配空间的问题。
作者: 蓝色键盘    时间: 2003-05-28 13:08
标题: main函数参数请教
我觉得这个空间估计在连接编辑程序中处理的,具体怎么处理,我不清楚。

以上也是个人观点,如果哪位知道确切的过程,感激不尽!
作者: fieryfox    时间: 2003-05-28 13:24
标题: main函数参数请教
启动代码做的。main只是它调用的函数。
作者: likec    时间: 2003-05-28 13:28
标题: main函数参数请教
[quote]原帖由 "fieryfox"]启动代码做的。main只是它调用的函数。[/quote 发表:
   

启动代码如何做的话,也应该分配空间啊?
作者: 蓝色键盘    时间: 2003-05-28 13:37
标题: main函数参数请教
启动代码如何做的话,也应该分配空间啊?

应该是吧,这个东西我觉得没必要深究。
作者: fieryfox    时间: 2003-05-28 13:56
标题: main函数参数请教
空间当然是要分配的,是启动代码分配的。可以参考crt1.asm。每个编译器都有自己的crt代码。
作者: robinliu76    时间: 2003-05-28 17:36
标题: main函数参数请教
是啊,我也觉得没有必要深究这个问题的,其实C语言程序运行并不是从MAIN函数开始的.
作者: likec    时间: 2003-05-28 17:53
标题: main函数参数请教
可是我觉得了解的话,对c的理解或者对编程的理解能从另外的角度了解,所以我觉得我还是要想办法解决这个问题:)
另外,请斑竹在帮忙看如下的程序有无问题?
#include <unistd.h>;
int main()
{
    char *name[2];
    name[0]="/usr/bin/ksh";
    name[1]=NULL;
    execve(name[0],name,NULL);
    return 0;
}
这个程序中,name[0]不需要先用malloc分配空间么?
还有name[0]能给直接从一个字符串赋值,而不需要用strcpy()函数么?谢谢指教!
作者: likec    时间: 2003-05-28 17:58
标题: main函数参数请教
[quote]原帖由 "fieryfox"]空间当然是要分配的,是启动代码分配的。可以参考crt1.asm。每个编译器都有自己的crt代码。[/quote 发表:
     

fieryfox兄,按你的提示,我找了crt1.asm看了看,可at&t的汇编语法实在是搞不懂,有没有这方面的资料提示啊?多谢
作者: JohnBull    时间: 2003-05-28 18:48
标题: main函数参数请教
[quote]原帖由 "likec"]接从一个字符串赋值,而不需要用strcpy()函数么?谢谢指教![/quote 发表:
     

你的name[0]本来就是一个指针,赋值后指向了"/usr/bin/ksh",没有问题。在编译的时候已经为"/usr/bin/ksh"分配了内存。
作者: 无双    时间: 2003-05-28 18:59
标题: main函数参数请教
]="/usr/bin/ksh";
字符串是一个常量地址

可以指向它
但不可以改写它

另外参数是有限制的
限制只是看你的系统永定

main的参数是在shell启动程序时把它放到程序一一个预留缓冲区中

就是说程序由shell启动
shell初始化完程序运行条件后才调用程序的main函数
作者: likec    时间: 2003-05-28 19:10
标题: main函数参数请教
多谢多谢两位斑竹,明白了,strcpy()之前必须先用malloc,而用=“”就可以。结果也不一样,strcpy是在内存中将字符串copy了一遍,而=“”只是指针变量值赋值,内存中并没有将字符串进行copy。
作者: likec    时间: 2003-05-28 19:38
标题: main函数参数请教
原帖由 "无双"] 发表:
="/usr/bin/ksh";
。。。。。。
main的参数是在shell启动程序时把它放到程序一一个预留缓冲区中

就是说程序由shell?.........
   

无双斑竹,我做了如下的猜想,帮忙看看是不是这样:
int start_func()
{
   ......
    int i;
    int argc;
    char * argv[MAX_PARAMS+1];
    ......
    argc=nparams;
    /*nparams为已经分析到的参数个数*/
    for(i=0;i<argc;i++){
         argv=(char *)malloc(100);
         strcpy(argv,a_parameter);
         /*a_parameter是已经分析过得shell传来的参数,为字符串*/
     }
     argv[argc]=NULL;
     main(argc,argv);
     ......
     for(i=0;i<argc;i++){
          free(argv);
     }
     ...
}
int main(int argc,char *argv[])
{
   ......
}
然后将start_func编译好,作为shell的一个部分?
然后这个MAX_PARAMS就是main可以接受的最大参数。
作者: 无双    时间: 2003-05-28 20:14
标题: main函数参数请教
应该是,这方面也不是很懂,愿意和大家一起研究
另外我觉得参数应该是由内核传给的
因为由内核分配进程的地址空间并进行初始化
作者: 蓝色键盘    时间: 2003-05-29 09:56
标题: main函数参数请教
对于main的调用和参数设置是由_start的例程完成的。
编辑连接程序默认的实际入口是一个标号,可能是_start.*,这个标记不是一个函数,仅仅是连接程序的一个入口点,也不是一个系统调用,因为它不是由Init 0x80调用执行的,该_start内部至少包含启动例程_start。

如果disass楼主的代码,会发现启动例程设置的main参数的堆栈布局如下:
首先是argc,其次argv,最后是envp。


likec所描述的crt1.o库中只是提供了这个启动过程的接口,包括main和例程_start的申明定义。
作者: 蓝色键盘    时间: 2003-05-29 10:00
标题: main函数参数请教
有兴趣的可以看看这个连接
http://www.sslug.dk/emailarkiv/cprog/2002_04/msg00060.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2