【问题标题】:Program stops working after printing argv打印 argv 后程序停止工作
【发布时间】:2014-03-29 21:07:59
【问题描述】:

我写了一些基本的代码

#include <iostream>
using namespace std;

int main( int argc, char *argv[] ){
    for (int i=1;i<=argc;i++){
        cout << argv[i] <<"\n";
    }
    cout <<"hello";

    return 0;
}

当我运行它时,例如

./a.out 1 2 3

我明白了:

1
2
3

为什么没有“你好”?

【问题讨论】:

  • 可能是因为你害羞了flush
  • i&lt;argc替换i&lt;=argc
  • @Rubens:不,流在程序结束时被刷新。

标签: c++ argv


【解决方案1】:

您的循环尝试流式传输argv[argc],这是您的程序参数之后的一个

其实它被定义为一个空指针1,给流一个空指针设置它们的错误位2

因此,您的下一个流操作 (cout &lt;&lt; "hello") 失败。

循环到argc 但不包括它

for (int i = 1; i < argc; i++) {
    cout << argv[i] << '\n';
}

脚注 1

[C++11: 3.6.1/2]: [..] argv[argc] 的值应为 0。[..]

脚注 2

[C++11: 27.7.3.6.4/3]: 要求:s 不得为空指针

如果是,则行为未定义; GCC 选择捕获条件并设置流的错误位 — 参见 https://stackoverflow.com/a/7019483/560648

【讨论】:

  • 当然,argv[0] 是可执行文件的名称。这就是为什么第一个参数是一个非 C 类的“1”。
  • @JohannesSchaub-litb:你在开玩笑吗?
  • @LightnessRacesinOrbit 不,绝对不是
  • @JohannesSchaub-litb:很遗憾听到这个消息:(
【解决方案2】:

您正在引用数组之外的 argv[argc]。

将你的 for 语句更改为:

for (int i=1;i<argc;i++){

【讨论】:

    猜你喜欢
    • 2014-01-03
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2013-11-11
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多