为什么argc的输出有差异?

时间:2017-07-14 11:12:14

标签: c++ linux g++

为什么下面的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的输出存在差异?

2 个答案:

答案 0 :(得分:3)

两种情况下代码的行为都是 undefined 。您需要将i<=argc替换为i < argc

C ++标准argv[argc]nullptr不要尝试取消引用。

答案 1 :(得分:2)

C ++规范和POSIX都指出argv[argc]始终是空指针。在循环条件中使用<=时,尝试取消引用该空指针。

取消引用空指针时,您将拥有undefined behavior (or UB)。它通常会导致崩溃printf函数通常检查空指针字符串并打印"(null)",但它仍然是UB。