命令行参数就是在主函数内调用的参数,系统自动会返回参数个数作为argc的值,包括可执行文件名在内的数个字符串都算是argv[]的内容。但是如果程序中调用了某个argv[n],输入时却缺失了这个argv[n],导致操作越界,调用了未初始化的argv指针,程序会怎么样呢?来看一段程序示例:
#include<iostream> #include<stdlib.h> using namespace std; void main(int argc,char*argv[]){ char p[6]="12345",q[6]="abcde"; if(strcmp(argv[1],p)<0)cout<<q; else cout<<p;}
这个程序很简单,比较现有的字符串p和argv[1],argv[1]小则输出q,反之输出p。运行效果如下:
没有问题,但如果缺失argv[1]会输出什么呢?未初始化的auto char里面应该是随机值,用strcmp函数理论上还是会返回结果,用以下程序进行测试:
#include<iostream> using namespace std; void main(){ char p[6],q[6]="abcde"; cout<<strcmp(p,q);}
输出结果:
说明即使未初始化的字符串比较后还是会返回一个值,那么命令行参数的字符串又如何呢?
不输入命令行参数执行开始的程序,什么都没有输出,cmd运行以后直接开启下一行命令栏,这意味着命令行参数的初始化不同于auto变量,进行如下测试:
#include<iostream> using namespace std; void main(int argc,char*argv[]){ cout<<argv[0]<<'\n'<<argv[1]; }
输出结果:
输出了argv[0],也就是文件名,但是argv[1]没有任何元素。
进行如下测试:
#include<iostream> using namespace std; void main(){ char p[6]="\0",q[6]="abcde"; cout<<"p:"<<p<<endl; cout<<strcmp(p,q); }
输出结果:
,说明argv不是这种情况。
#include<iostream> using namespace std; void main(){ char p[6]="",q[6]="abcde"; cout<<"p:"<<p<<endl; cout<<strcmp(p,q); }
输出结果:
,说明argv也不是这种情况。既然与上面输出结果一样,那么""与"\0"的初始化应该是等价的。
#include<iostream> using namespace std; void main(){ char *p,q[6]="abcde"; p=NULL; cout<<"p:"<<p<<endl; cout<<strcmp(p,q); }
输出结果:
,正如argv一样,strcmp也无法输出结果。
因此可以得出,argv最初都是空指针,无法进行字符串运算。