修复分段错误

Fixing Segmentation Fault

本文关键字:错误 分段      更新时间:2023-10-16

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

这似乎是您如何调用编译的二进制文件的问题。假设可执行文件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);

如果给定的参数不能解析为整数,这仍然不能保护您免受麻烦,但如果您想进入此领域,请考虑使用库来解析命令行选项。