命令行参数未初始化的探究(C)

发布于 2020-05-13  1722 次阅读


命令行参数就是在主函数内调用的参数,系统自动会返回参数个数作为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。运行效果如下:

image.png

没有问题,但如果缺失argv[1]会输出什么呢?未初始化的auto char里面应该是随机值,用strcmp函数理论上还是会返回结果,用以下程序进行测试:

#include<iostream>
using namespace std;
void main(){
char p[6],q[6]="abcde";
cout<<strcmp(p,q);}

输出结果:

image.png

说明即使未初始化的字符串比较后还是会返回一个值,那么命令行参数的字符串又如何呢?

image.png

不输入命令行参数执行开始的程序,什么都没有输出,cmd运行以后直接开启下一行命令栏,这意味着命令行参数的初始化不同于auto变量,进行如下测试:

#include<iostream>
using namespace std;
void main(int argc,char*argv[]){
cout<<argv[0]<<'\n'<<argv[1];
}

输出结果:

image.png

输出了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);
}

输出结果:

image.png

,说明argv不是这种情况。


#include<iostream>
using namespace std;
void main(){
char p[6]="",q[6]="abcde";
cout<<"p:"<<p<<endl;
cout<<strcmp(p,q);
}

输出结果:

image.png

,说明argv也不是这种情况。既然与上面输出结果一样,那么""与"\0"的初始化应该是等价的。


#include<iostream>
using namespace std;
void main(){
char *p,q[6]="abcde";
p=NULL;
cout<<"p:"<<p<<endl;
cout<<strcmp(p,q);
}

输出结果:

image.png

,正如argv一样,strcmp也无法输出结果。


因此可以得出,argv最初都是空指针,无法进行字符串运算。


华科菜鸡计科学生