【问题标题】:Segmentation fault (core dumped) run time bug with MaxPairwiseProduct programMax Pairwise Product 程序的分段错误(核心转储)运行时错误
【发布时间】:2018-12-16 09:51:39
【问题描述】:
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int main()
{
    int MaxPairwiseProduct(vector<int>& numbers);
    //declaration
    vector<int> *x;
    x->push_back(1);
    x->push_back(2);

    int answer = MaxPairwiseProduct(*x);
    cout << answer;
}

int MaxPairwiseProduct(vector<int>& numbers) {
    int index1 =  1;
    int index2;

    //vector<int> numbers = number;
    int n = numbers.size();
    for(int i = 2;i < n;++i){
        if(numbers[i]>numbers[index1]){
            index1 = i;
            }
    }
    if(index1 == 1){
        index2 = 2;
    } else {
    index2 = 1;
    }

    for(int i = 1;i < n;++i){
        if(numbers[i] != numbers[index1] && numbers[i]>numbers[index2]){
            index2 = i;
        }
    }
    numbers[index1] * numbers[index2];
    return numbers[index1] * numbers[index2];
}

我正在尝试实现一个看似先进的算法来找到最大对明智的产品。我继续收到分段错误(核心转储)错误,我知道这可能与我的指针和函数范围有关。有什么建议或提示吗?

【问题讨论】:

  • vector&lt;int&gt; *x; 你的向量指针永远不会被初始化为一个有效的实例。你为什么要在那里使用指针?
  • 公元前我可以我猜大声笑,想确保我记得 C++ 中的内存管理。如何将其初始化为有效实例?
  • 最好的方法是根本不使用指针:vector&lt;int&gt; x; 并用. 替换取消引用的-&gt; 箭头,当你将它传递给另一个时也省略*功能。
  • 我也这样做了,现在得到 0 作为错误的答案。
  • 这可能是另一个问题。我建议您在调试器中运行代码并逐行执行。

标签: c++ algorithm pointers memory vector


【解决方案1】:
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int main()
{
    int MaxPairwiseProduct(vector<int>& numbers);
    //declaration
    vector<int> *x = new vector<int>();
    x->push_back(7);
    x->push_back(4);
    x->push_back(5);
    x->push_back(6);


    int answer = MaxPairwiseProduct(*x);

    cout << answer;delete x;
}

int MaxPairwiseProduct(vector<int>& numbers) {
    int index1 =  1;
    int index2;

    //vector<int> numbers = number;
    int n = numbers.size();
    for(int i = 0;i < n;++i){
        if(numbers[i]>numbers[index1]){
            index1 = i;
            }
    }
    if(index1 == 1){
        index2 = 2;
    } else {
    index2 = 1;
    }

    for(int i = 0;i < n;++i){
        if(numbers[i] != numbers[index1] && numbers[i]>numbers[index2]){
            index2 = i;
        }
    }

    return numbers[index1] * numbers[index2];
}

我让它工作,有一个奇怪的深夜大脑放屁。

【讨论】:

  • 嘿 - 欢迎来到 stackoverflow!你的代码看起来不错。我只是想补充一点,您不必创建 x 作为指向向量的指针。将它用作向量可以正常工作,然后您不必在最后调用delete 它看起来像vector&lt;int&gt; x = vector&lt;int&gt;();vector&lt;int&gt; x{}
【解决方案2】:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


int main(){
    long MaxPairwiseProductFast(vector<long>& numbers);

    long N, input;
    vector<long> *V = new vector<long>();
    cin >> N;


    do {
                V->push_back(input);}
    while (V->size() <= N && cin >> input);

    long answer = MaxPairwiseProductFast(*V);

    cout << answer;
    delete V;
}

 long MaxPairwiseProductFast(vector<long>& numbers) {
    int index1 =  1;
    int index2 = 1;

    int n = numbers.size();
    for(int i = 2;i < n;++i){
        if(numbers[i]>numbers[index1]){
            index1 = i;
            }
    }
    if(index1 == 1){
        index2 = 2;
    } else {
    index2 = 1;
    }

    for(int i = 2;i < n;++i){
        if(i != index1 && numbers[i]>numbers[index2]){
            index2 = i;
        }
    }

    return  (long)(numbers[index1] * numbers[index2]);
}

long MaxPairwiseProduct(vector<long>& A) {
int index = 1;
int n = A.size();
for(int i = 2; i < n; ++i){
    if (A[i] > A[index]){
        index = i;
    }
}
swap(A[index], A[n]);
index = 1;
for (int i = 2; i < n-1; ++i){
    if(A[i] > A[index]){
        index = i;
    }
}
swap(A[index], A[n - 1]);
return A[n-1] * A[n];
}

具有用户定义向量大小和定义用户输入值的能力的修改版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2017-02-18
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多