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"));
}
解决方案
这似乎与您如何调用已编译的二进制文件有关。说可执行文件是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);
如果给定的参数不可解析为整数,这仍然无法保护您免受麻烦,但如果您想了解这一点,请考虑使用库来解析命令行选项。
推荐阅读
- gremlin - Measure serialization and deserialization time
- git - Jenkins 和 Github 从特定分支触发 PUSH
- ios - How to apply the eye Ball Rotation using ARKit in iOS from FaceTracking
- amazon-web-services - Terraform quickest way to import multiple resources
- gradle - 无法通知构建侦听器 Gradle Artifactory 插件
- laravel - Laravel 中 LeftJoin 的 OrderBy 结果
- tensorflow - 来自 tf.data 的数据是如何生成并传递给模型的
- django - 未找到带有参数 '('',)' 的 'company_delete' 的反向操作。尝试了 1 种模式:['company/(?P
\\d+)/删除/$'] - postgresql - Liquibase 生成空的 ALTER SEQUENCE 更改
- c# - 更新列的值 c# winforms applicaiton