偶爾對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,即用\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("$\n");
}
printf("\n");
strcpy(argv[0],"meilidezhongguo,nihao!");
for(i=0;i<argc,i++)
{
printf("%p,%s",argv[i],argv[i]);
printf("$\n");
}
printf("\n");
}
程序運行: ./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個字符補上\0.
理解限制,只能補充這些,下次有了新理解,再完善!