繁体   English   中英

分段错误C ++

[英]Segmentation fault error C++

我正在编写一个简单的程序,将两个向量交替进行,并将push_backs的向量转换为第三个向量,但是我遇到了分段错误错误(内核已转储)。 我做了一些研究,似乎是我正在访问不存在或不应该访问的内存。 我知道这是一个简单的修复程序,但是我对C ++还是很陌生,因此可以不胜感激。

vector<int> alternate(vector<int> a, vector<int> b)
{
    int n = a.size();
    int m = b.size();

    vector<int> c(n + m);

    int i;

    for(i = 0; i < a.size() and i < b.size (); i++)
    {
        c.push_back(a[i]);
        c.push_back(b[i]);
    }

    return c;
}

int main () {

    vector<int> a,b,c;
    int temp1;
    int temp2;

    while (temp1 != -1) {
        cin >> temp1;
        if(temp1 == -1) {
            break;
        }
        a.push_back(temp1);
    }

    while (temp2 != -1) {
        cin >> temp2;
        if(temp2 == -1) {
            break;
        }
        b.push_back(temp2);
    }

    c = alternate(a,b);

    int i;
    for(i = 0; i < c.size(); i++) {
        cout << c[i] << endl;
    }
}

据我所知,您在这里有两个问题:

  1. 您在条件中使用了temp1temp2 ,但没有初始化它们,这是UB。 尝试int temp1 = 0; int temp2 = 0; int temp1 = 0; int temp2 = 0;
  2. 在功能alternate中,您将使用两个输入向量之和初始化返回向量,例如vector<int> c(n + m); ,然后使用push_back添加这些输入的元素。 这样,您将在返回向量的开始处输入n+m零,然后在输入元素处输入零。 我很确定您不想要这个。 您不需要为向量设置默认大小,只需使用push_back如果您坚持使用默认大小,则可以为向量的索引分配值。

您的代码有一些问题,上面提到了一些问题。 最重要的问题如下:

  1. temp1和temp2未初始化。 根据您的编译器,在while循环中访问它们时,它们可能是0或某个随机数。
  2. 最终向量将太大。 创建c时,要创建的大小为n + m,因此它已经包含了许多元素,每个元素的值为0。然后,您将其他向量的元素相加,得出的最终向量大约为(n + m)* 2。
  3. 我在上面说“大约”是因为另一个问题是,除非n == m,否则最终向量将丢失a和b中较大者的最后一个元素。 您需要迭代到n和m中较大的一个,检查while循环以确保可以安全地访问项目。

其他较小的问题如下:

  1. 当您将a和b传递给另一个时,您正在复制它们。 通过使用const引用,可以避免复制。
  2. 尽管可能性不大,但a或b可能容纳比“ int”所引用的项目更多的项目。 使用size_t是安全的。 甚至更好地使用“ auto”来允许编译器自动确定正确的类型。
  3. 通过将临时变量置于“ for”和“ while”循环中来限制其可见性。
  4. 在循环中使用较新的向量以避免可能的索引需求(这是不可能的,但是在写出最终结果时是可能的。

毕竟,结果应类似于以下内容:

#include <iostream>
#include <vector>

using namespace std;

vector<int> alternate(const vector<int>& a, const vector<int>& b)
{
    const auto n = a.size();
    const auto m = b.size();
    const auto N = max(n, m);

    vector<int> c;
    c.reserve(n+m);

    for(size_t i = 0; i < N; ++i)
    {
        if (i < n) c.push_back(a[i]);
        if (i < m) c.push_back(b[i]);
    }

    return c;
}

int main () {

    vector<int> a,b,c;

    while (true) {
        int temp;
        cin >> temp;
        if(temp == -1) {
            break;
        }
        a.push_back(temp);
    }

    while (true) {
        int temp;
        cin >> temp;
        if(temp == -1) {
            break;
        }
        b.push_back(temp);
    }

    c = alternate(a,b);

    for (auto val : c) {
        cout << val << endl;
    }
}

正如两个答案所指出的,未初始化的变量以及使我的“ c”向量太大是罪魁祸首

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM