2017-07-14 88 views
0

为什么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的输出有差异?

+3

'我<= argc'导致未定义的行为。如果'argc'是2,那么有效的'argv'索引是'argv [0]'和'argv [1]'。 'argv [2]'是未定义的行为。 – jww

+0

刚刚发生'std :: cout'机制混淆,因为你在代码中访问'argv [argc]'。如果你在'std :: cout << argc << std :: endl;'之前运行'fprintf(stdout,“%d \ n”,argc);',或许你可以得到'argc'的值它发生在我身上)。无论如何:总是像其他人告诉你的那样, tzot

回答

2

它由C++规范和POSIX指定argv[argc]将始终为空指针。当您在循环条件中使用<=时,您试图取消引用空指针。

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

+0

在第一种情况下,我在“for循环”之外使用了“cout for argc”。循环没有{},所以只考虑下面的一条语句。它适用于“printf” – varun

+0

@varun更新了我的答案。 –

3

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

由C++标准argv[argc]nullptr不要尝试解除引用。