免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5233 | 回复: 6
打印 上一主题 下一主题

[函数] main函数参数请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-28 11:52 |显示全部楼层 |倒序浏览
main(int argc,char *argv[],char **environ)
函数中,传给main的参数的个数有没有限制?
若有,是多少?
若无,那argv的地址如何分配用来装参数?
比如,我们自己写的程序里
my_fun(int n,char *v[])
{
   .......
   v=(char *)malloc(size);/*需要先分配空间才能写,可是main中不需要*/
   ......
}

论坛徽章:
0
2 [报告]
发表于 2003-05-28 13:02 |显示全部楼层

main函数参数请教

原帖由 "蓝色键盘" 发表:
标准C规定是两个参数,但是大多数的unix系统提供了三个参数,第三个参数用来向调用main函数的例程(一般的是一个shell例程exec)传递环境变量表。

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


谢谢斑竹关于第三个参数的说明。
我问的还有就是argv分配空间的问题。

论坛徽章:
0
3 [报告]
发表于 2003-05-28 13:28 |显示全部楼层

main函数参数请教

[quote]原帖由 "fieryfox"]启动代码做的。main只是它调用的函数。[/quote 发表:
   

启动代码如何做的话,也应该分配空间啊?

论坛徽章:
0
4 [报告]
发表于 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()函数么?谢谢指教!

论坛徽章:
0
5 [报告]
发表于 2003-05-28 17:58 |显示全部楼层

main函数参数请教

[quote]原帖由 "fieryfox"]空间当然是要分配的,是启动代码分配的。可以参考crt1.asm。每个编译器都有自己的crt代码。[/quote 发表:
     

fieryfox兄,按你的提示,我找了crt1.asm看了看,可at&t的汇编语法实在是搞不懂,有没有这方面的资料提示啊?多谢

论坛徽章:
0
6 [报告]
发表于 2003-05-28 19:10 |显示全部楼层

main函数参数请教

多谢多谢两位斑竹,明白了,strcpy()之前必须先用malloc,而用=“”就可以。结果也不一样,strcpy是在内存中将字符串copy了一遍,而=“”只是指针变量值赋值,内存中并没有将字符串进行copy。

论坛徽章:
0
7 [报告]
发表于 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可以接受的最大参数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP