偶尔对main函数的参数感兴趣,写了个程序验证。
int main(int argc,char **argv)
首先,解释两点:
第一 、系统将参数列表,即我们在shell下输入的命令,存储到一个一维字符数组中,而且用户是可修改的,肯定没存在常量区。
第二 、argv实际上是一个char*argv[],字符指针数组,元素个数现在不清楚,至少有argc个,还有一些其他的,例如HOSTNAME,SELINUX_ROLE_REQUESTED,TERM,SHELL,HISTSIZE,SSH_CLIENT,SELINUX_USE_CURRENT_RANGE,QTDIR,QTINC,SSH_TTY,SVN_EDITOR等,
然后根据参数列表中的空格,划分各个参数,各个参数的首地址存储到argv[i]中,然后让*(argv[i]-1)=0,即用 代替原来的空格,这样可以打印出各个参数。
下面贴出我的程序,大家可以自己试验一下。
/*argcargv.c*/
#include <stdio.h>
#include <string.h>
int main(int argc,char ** argv)
{
int i;
for(i=0;i<argc/*20,可以自己设定一个大于argc的值,看看argv到底有多少个元素*/;i++)
{
printf("%p,%s",argv[i],argv[i]);
printf("$ ");
}
printf(" ");
strcpy(argv[0],"meilidezhongguo,nihao!");
for(i=0;i<argc,i++)
{
printf("%p,%s",argv[i],argv[i]);
printf("$ ");
}
printf(" ");
}
程序运行: ./a.out abc 123 def 456 hello 789 world
我的电脑运行结果如下:
0xbff64758,./a.out$
0xbff64760,abc$
0xbff64764,123$
0xbff64768,def$
0xbff6476c,456$
0xbff64770,hello$
0xbff64776,789$
0xbff6477a,world$
(nil),(null)$
.......
.......
.......
.......
0xbff64758,meilidezhongguo,nihao!$
0xbff64760,hongguo,nihao!$
0xbff64764,guo,nihao!$
0xbff64768,nihao!$
0xbff6476c,o!$
0xbff64770,hello$
0xbff64776,789$
0xbff6477a,world$
也可以用
strncpy(argv[0],"meilidezhongguo,nihao!",28);
代替strcpy(argv[0],"meilidezhongguo,nihao!");
试试,
还可以看出strncpy,拷贝了22个字符,strlen("meilidezhongguo,nihao!");剩下额6个字符补上 .
理解限制,只能补充这些,下次有了新理解,再完善!