为什么下面argc的输出有差异?
第一:
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
int main(int argc,char *argv[])
{
for(int i=1;i<=argc;i++)
std::cout<<argv[i]<<"n"<<std::endl;
std::cout<<argc<<std::endl;
return 0;
}
我得到了 argv 的输出,但我没有得到 argc 的输出。
第二种情况:
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
int main(int argc,char *argv[])
{
std::cout<<argc<<std::endl;
for(int i=1;i<=argc;i++)
std::cout<<argv[i]<<"n"<<std::endl;
return 0;
}
我得到了argv和argc的输出。
在这两种情况下,如果我使用"printf"而不是"cout",我会得到 argc 的输出。
为什么argc的输出会有所不同?
在这两种情况下,代码的行为都是未定义的。您需要将i<=argc
替换为i < argc
.
按照C++标准,argv[argc]
是nullptr
.不要试图取消引用它。
C++规范和 POSIX 都指定argv[argc]
始终为空指针。当您在循环条件中使用<=
时,您尝试取消引用该空指针。
取消引用空指针时,将具有未定义的行为(或 UB(。它通常会导致崩溃。printf
函数通常检查空指针字符串并打印"(null)"
,但它仍然是 UB。