为啥在此 C++ 代码中出现分段错误?

Posted

技术标签:

【中文标题】为啥在此 C++ 代码中出现分段错误?【英文标题】:Why do I get a segmentation fault in this C++ code?为什么在此 C++ 代码中出现分段错误? 【发布时间】:2019-08-13 06:13:26 【问题描述】:

我正在解决 HackerRank 上的问题,到目前为止,我已经能够轻松地进行所有故障排除,但是对于这个问题,我遇到了分段错误。

我在网上查了一下,发现这意味着我正在访问一个没有分配给任务的内存。

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() 
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */  
    int N, x, a, b;
    vector<int> v;
    cin >> N;
    for(int i = 0; i < N; i++) 
        int a;
        cin >> a;
        v.push_back(a);
    
    cin >> x;
    v.erase(v.begin() + x-1);
    v.erase(v.begin() + a-1, v.begin() + b-2);
    cout << v.size() << "\n";
    for(int i = 0; i < v.size(); i++) 
        cout << v[i] << " ";
    
    return 0;

为什么会出现此错误?我能看到的唯一可能的问题是我应该在某处使用指针或引用,但我仍然不清楚它们是如何工作的。

【问题讨论】:

遇到段错误时输入什么值? 您正在使用未初始化的变量a @JohnArg 它在 main 的第一行声明,在任何时候都没有初始化。 编译时也请开启警告。编译器会告诉你未初始化变量的使用。 @JohnArg 你的编译器应该对可疑代码(你有很多)发出警告。要么你忽略了这些警告,要么你压制了它们。大多数编译器都有启用显示警告消息的选项。 【参考方案1】:

这里有一个明显的问题

v.erase(v.begin() + a-1, v.begin() + b-2);

在程序中,您不会给b 赋值。

a 都没有初始化,因为虽然你的 for 循环中有一个变量 a,但它与在 main 顶层声明的变量不同。所以ab 此时都未初始化,这可能解释了你的崩溃。

【讨论】:

以上是关于为啥在此 C++ 代码中出现分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]

为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?

为啥在使用 Python/C API 时会出现此段错误?

为啥大型静态数组会产生段错误而动态却不会? (C++)

为啥在某些机器上堆栈溢出,但在另一台机器上出现分段错误?

为啥这个看似简单的 C++ 代码会产生分段错误?