为什么下面的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的输出。
在这两种情况下,如果我使用&#34; printf&#34;而不是&#34; cout&#34;我得到了argc的输出。
为什么argc的输出存在差异?
答案 0 :(得分:3)
两种情况下代码的行为都是 undefined 。您需要将i<=argc
替换为i < argc
。
C ++标准argv[argc]
是nullptr
。 不要尝试取消引用。
答案 1 :(得分:2)
C ++规范和POSIX都指出argv[argc]
始终是空指针。在循环条件中使用<=
时,尝试取消引用该空指针。
取消引用空指针时,您将拥有undefined behavior (or UB)。它通常会导致崩溃。 printf
函数通常检查空指针字符串并打印"(null)"
,但它仍然是UB。