为什么argc的输出会有所不同?



为什么下面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。

最新更新