C ++中带向量的分段错误

时间:2016-01-29 19:11:01

标签: c++ vector

我是C ++的新手,我有一个问题(对不起,如果它太基本但我想知道)。所以我有这个代码,它应该将向量的每个元素与一个数字相乘:

#include<iostream>
#include "IntCell.h"
#include<vector>
using namespace std;

vector<float> MatMult(int a, vector<float> & b)
{
vector<float> c;
int i;
for(i=0;i<=b.size();i++){
    c[i]=b[i]*a;
}
return c;

}

int main()


{int a=3;
 vector<float> b{1,2,3,4,5};
 vector<float> c = MatMult(a,b);
 cout<<c[2];
}

它编译得很好,但是我得到了分段错误:11。它出了什么问题? 谢谢!

4 个答案:

答案 0 :(得分:3)

如果你有一个合理的当前编译器,这更简单。取值vector乘以值并乘以基于范围的for循环以避免超出范围的错误。

vector<float> MatMult(int a, vector<float> b)
{
    for (float& value : b) {
        value *= a;
    }
    return b;
}

这可以作为模板功能更通用。请注意,下面的代码几乎肯定可以改进。

template <typename T>
vector<T> MatMult(int a, vector<T> b)
{
    for (auto& value : b) {
        value *= a;
    }
    return b;
}

答案 1 :(得分:2)

你不能c[i],因为还没有这样的索引。您最好使用c.push_back(b[i] * a)编写c.reserve(b.size())或预分配内存。

还有什么,b.size()会返回向量中的元素数,而不是最大的索引,因此您应该使用i < b.size()而不是{{1} }}。

答案 2 :(得分:2)

vector<float> c;创建一个空向量。然后,您在c[i]=b[i]*a;中使用它,这是未定义的行为,因为c[anything]不存在。

如果您想使用c,则需要将b设为与c[i]=b[i]*a;相同的尺寸。那看起来像是:

vector<float> MatMult(int a, vector<float> & b)
{
    vector<float> c(b.size());

    for(int i = 0; i < b.size(); i++){
//                   ^ use < here since b[b.size()] is out of bounds
        c[i]=b[i]*a;
    }

    return c;
}

答案 3 :(得分:1)

除了给出的其他答案之外,如果您正在访问超出范围的向量,立即发现的一种方法是首先使用vector::at()开发而不使用[]

vector<float> MatMult(int a, vector<float> & b)
{
   vector<float> c;
    int i;
    for(i=0;i<=b.size();i++){
        c.at(i) = b.at(i) * a;
}
return c;

除了分段错误之外,您还会获得out_of_range异常,从而为您提供有关问题的更多信息。一旦摆脱了所有out_of_range错误,您就可以切换到使用[]

Live Example using vector::at