簡體   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