关于main(int argc, char* argv[])的理解

来源:互联网 发布:js window.scrolltop 编辑:程序博客网 时间:2024/05/22 00:48

       问题描述:主进程启动多个子进程程序是需要向子进程程序传输参数,而我们知道如果向程序中传递参数也就是向main函数中传递参数,需要用到argv数组来存储参数,读取这个参数就需要对argv数组进行访问,对于这个问题我始终难以调试通过,今天仔细想了想是因为访问了野指针。

       下面看一段代码,这段代码中没有任何操作,直接打印数组argv的信息。

[cpp] view plain copy
print?
  1. #include <stdio.h>  
  2. #include <windows.h>  
  3.   
  4. int main(int argc,char* argv[])  
  5. {  
  6.     for (int i=0;i<argc;i++)  
  7.     {  
  8.         printf("%s\n",argv[i]);  
  9.   
  10.     }  
  11.     system("pause");  
  12.     return 0;  
  13. }  
得到的运行结果如图示:

可以发现在没有任何参数输入的条件下,数组argv并不为空,而是含有一个参数,也就是当前执行文件的路径及文件名。这个可执行文件存储在argv[0]中。

下面利用VS2005的项目属性->调试->命令参数设置输入参数“I am gecko”,继续运行程序。

得到的结果如图所示

也就是发现输入参数是从argv[1]开始填充,argv[0]的位置依旧是存储的执行文件的路径以及文件名。

问题也就会在这里出现,如果使用的VS2005对程序进行调试,同时没有在命令参数中设置参数的话,如果访问argv[1]以后的位置就会报错。

出现上面的情况有种最大的可能就是对空指针进行操作了。(话说以前经常碰到这样的问题,弄得一头雾水

这种情况的处理办法,可以在对指针进行操作时,首先对参数个数进行一次检测。

[cpp] view plain copy
print?
  1. // 如果要访问argv[1],argv[2],则可参数检查  
  2.     if(argc != 3)  
  3.     {  
  4.         return 1;  
  5.     }  
其实: int main(int argc,char *argv[]) 是 UNIX 和 Linux 中的标准写法,而 int main() 只是 UNIX 及 Linux 默许的用法.. 

下面看个例子 edit.c

[cpp] view plain copy
print?
  1. #include<unistd.h>   
  2. #include<stdio.h>   
  3.   
  4. int main(int argc,char *argv[])   
  5. {   
  6.     if(argc==1 || argc>2) {   
  7.         printf("请输入想要编辑的文件名如:./edit fillen");   
  8.     }   
  9.     if(argc==2) {   
  10.         printf("编辑 %sn",argv[1]);   
  11.     }   
  12.     exit(0)   
  13. }   

编译该程序:gcc -o edit edit.c 
运行:./edit 
结果:请输入想要编辑的文件名如:./edit fille 
运行:./edit edit.txt 
结果:编辑 edit.txt 

看到这里 argc,argv[] 如何用就很明白了,argc 是外部命令参数的个数,argv[] 存放各参数的内容,如上例:执行 ./edit 时,argc 为1, 
argv[0] 为 ./edit .而执行 ./edit edit.txt 时,argc 的值为 2, 
argv[0] 为 ./edit,argv[1] 为 edit.txt .
您有6
1 0
原创粉丝点击