C++ EXC_BAD_ACCESS, argv[]

C++ EXC_BAD_ACCESS, argv[]

本文关键字:argv ACCESS EXC BAD C++      更新时间:2023-10-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]);
    // ...

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

代码在终端中运行,但没有通过我班的自动分级器。

输入的参数:

/21点400 1

应该适用于任何数字。

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

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

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

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

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

正如其他人所指出的,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;
  }

如果我忘记了程序询问的命令行参数。如果我记住了参数,则使用该参数而不需要进一步干预。很明显,你可以将其扩展到更多的论点中。