【问题标题】:C++ EXC_BAD_ACCESS, argv[]C++ EXC_BAD_ACCESS, argv[]
【发布时间】:2012-08-07 08:02:16
【问题描述】:

我已经被这个问题困扰了一段时间,无法调试这个EXC_BAD_ACCESS 错误。我已经运行了 NSZombie,我很确定这是 argv[1] 的内存问题(或其他任何问题)。我检查了我的语法和库,所以我不知道为什么它不会存储超过 arg[0]

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

int main(int argc, char* argv[])
{
    cout << "Enter the initial bankroll" << endl;
    int bankroll = atoi(argv[1]); //code faults here

    cout << "Enter seed" << endl;
    int seed = atoi(argv[2]);

    // ...

我省略了其余部分,因为错误发生在其他任何事情之前。

代码在终端中运行,但我的班级的自动评分器失败了。

输入的参数:

./二十一点 400 1

应该适用于任何数字。

argv[0] 不应该是二十一点,argv[1] 是第一个数字,argv[2] 是第二个数字吗?

【问题讨论】:

  • 您“相信”还是知道?有一个很大的区别......
  • 对不起。让我编辑并提供更多细节。
  • 你说你得到EXC_BAD_ACCESS,但程序在终端运行? EXC_BAD_ACCESS 发生在哪里?使用自动评分器?
  • 我认为这是您应该向设计自动评分机的人提出的问题。我怀疑您不是要使用命令行参数,而是应该重定向 cin 以便它从文件中读取。但谁知道呢,我不认为这是任何人都可以回答的问题。

标签: c++ exc-bad-access command-line-arguments


【解决方案1】:

cout 填充argv 的元素,这些元素来自用于执行程序的命令行。此外,无论何时使用argv,请务必检查argc,这是argv 的有效索引数。您的程序可能崩溃了,因为您没有向程序传递任何参数,因此argv 的元素不可用。

您需要使用cin 调用来读取您期望的用户输入,或者更改您的程序以使用从命令行传入的值,即没有提示或读取。

您添加的关于argv 的假设是正确的:如果您使用./blackjack 400 1 执行程序,那么argv[1] 应该是400,而argv[2] 应该是1

因为,根据您的编辑,您似乎想从命令行获取这些数字,然后删除您的 cout 调用。

【讨论】:

  • 我认为很明显 OP 想用cin 阅读,但不知何故与命令行参数混淆了。有这么奇怪的误会,我一开始没有看到。
  • @pb2q 该项目必须使用命令行参数来获取种子和资金变量,否则 cin 会简单得多! :)
  • 当我从终端运行程序时,它运行。但是,在 Xcode 中,当我在底部构建并运行时,它会显示:GDB:程序收到信号:“EXC_BAD_ACCESS”(但它仍然在右下角显示成功)。在 Hypergrade 中,我们的自动分级机只能到达第一个 cout,然后失败。
  • @pb2q 另外,我输入了参数。 cout 存在的唯一原因是自动评分器逐个字符地检查并在正确的输出示例中显示它们。 (他们什么都不做;不知道为什么自动分级机希望它在启动程序时已经输入种子时'cout'“输入种子”)
【解决方案2】:

正如其他人所说,argv 是命令行参数。如果它们被填满,您只需使用它们。我经常这样做:

int
main(int n_app_args, char** app_arg)
{
  std::string nec_file;
  if (n_app_args > 1)
    nec_file = app_arg[1];
  else
  {
    std::cout << "Enter NEC output file: ";
    std::cin >> nec_file;
  }

如果我忘记了程序问我的命令行参数。如果我记得这个论点,那么这个论点是在没有进一步干预的情况下使用的。您显然可以将此扩展到更多参数。

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 2015-12-21
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多