我必须为我的班级运行这段代码,我们使用的大多数是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"));
}
答案 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);
如果给定的参数不能解析为整数,这仍然无法避免麻烦,但是,如果您想使用此参数,请考虑使用库来解析命令行选项。