首页 > 解决方案 > 修复分段错误

问题描述

我必须为我的班级运行这段代码,我们使用的大部分是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"));
}

标签: c++

解决方案


这似乎与您如何调用已编译的二进制文件有关。说可执行文件是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);

如果给定的参数不可解析为整数,这仍然无法保护您免受麻烦,但如果您想了解这一点,请考虑使用库来解析命令行选项。


推荐阅读