修复分段错误

时间:2019-02-12 14:27:23

标签: c++

我必须为我的班级运行这段代码,我们使用的大多数是java,我并不是很了解c ++,但是我必须运行的代码是c ++,所以我发现很难调试或知道怎么了要编译它,我使用的是UNIX虚拟机。我已经对其进行了编译,并在目录中包含了a.out文件。当我运行a.out文件时,它显示“分段错误”。我读过这意味着它正在尝试访问它无法访问的内容,但是我不知道那是什么。他们提供给我们的代码是否有问题,或者可能是我机器上的设置?

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <iostream>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{
  int N;
  sscanf(argv[1], "%d", &N);
  vector<double> data(N);
  for(unsigned int i=0; i<N; i++) {
    data[i] = rand()/(RAND_MAX+1.0);
  }
  sort(data.begin(), data.end());
  copy(data.begin(), data.end(), ostream_iterator<double>(cout,"\n"));
}

1 个答案:

答案 0 :(得分:2)

这似乎与如何调用已编译的二进制文件有关。假设可执行文件为a.out,则应以以下方式执行程序:

./a.out 42

如该代码段

sscanf(argv[1], "%d", &N);

std::vector的大小是从命令行参数解析的。如果不传递任何参数,则argv仅具有一个元素(可执行文件名称),而argv[1]是无界访问,从而产生未定义的行为。请注意,您可以使用argc变量预先进行一些基本的错误处理:

int N = 42; // some sensible default value

if (argc == 2)
   sscanf(argv[1], "%d", &N);

如果给定的参数不能解析为整数,这仍然无法避免麻烦,但是,如果您想使用此参数,请考虑使用库来解析命令行选项。