输出的第一部分是正确的然后我得到分段错误?

时间:2014-10-12 22:05:13

标签: c++ c++11

我正在尝试使用函数输出向量的值。 “gv”输出的值,但在尝试输出第二个矢量时,“vv”我得到分段错误。有人可以帮助我至少了解发生了什么以及为什么我会收到此错误。我的程序的哪个部分也会发生这种情况。谢谢。另外,我使用的是基于linux服务器的putty编译器

    #include <iostream>
    #include <vector>
    #include <string>
    #include <exception>
    #include <cmath>
    #include <limits>
    using namespace std;

    vector<int>gv{1, 2, 4, 8, 16, 32, 64, 128, 256, 512}; //global vector

    void f(vector<int>a) //function f that takes in a vector argument
    {
        vector<int>lv(10);

            for(int i=0;i<10;i++){ //loop that sets values of gv to lv
                lv[i] = gv[i];
                cout<< lv[i]<<endl;
            }

         cout<<'\n';

        vector<int>lv2 = a; //loop that assigns the values of the argument vector to lv2
            for(int i = 0; i<10; i++){
            cout<< lv2[i]<<endl;
            }

    }

    int main() {

    f(gv); //function that uses the global variable gv

    vector<int>vv(10); //creating a new vecotr vv

        for(int i = 1; i<11;++i){ //loop to assign values of the first ten factorials
            vv[0] = 1;
            vv[i] = vv[i-1]*(i+1);
        }
    f(vv); //function using vv
    }

2 个答案:

答案 0 :(得分:1)

vector在索引时不会自动增长,如果要将项目附加到向量的末尾,请使用push_back。这将扩展矢量,因为它需要增长。

std::vector<int> vv = {1}; // initializes the vector with one element
for(int i = 1; i < 11; ++i){
    vv.push_back(vv[i-1]*(i+1));
}

如果要启动具有特定大小的向量,可以使用带参数的构造函数。

std::vector<int> vv(10); // constructors a vector with 10 elements (all set to 0)

此外,如果您希望检查访问权限,则可以使用vv.at(i)代替vv[i]。如果使用无效索引,使用at将抛出std::out_of_range

我建议使用back而不是索引,这会将你的循环变为:

std::vector<int> vv = {1};
for(int i = 1; i<11;++i) {
    vv.push_back(vv.back() * (i+1));
}

使用lvgv的循环也可以重写为基于范围的循环 vectorlv(10);

for(auto&& i : gv) {
    lv.push_back(gv[i]);
    std::cout<< i << '\n';
}

但如果这就是你所需要的,那么你可以通过执行以下操作来复制矢量,而不是循环。

auto lv = gv;
auto lv2 = a;

答案 1 :(得分:0)

问题在于,当您创建向量时,不会将大小传递给构造函数,因此默认情况下它为零。

vector<int>vv; //creating a new vecotr vv

然后,当您尝试遍历vv时,您正在访问您不拥有的内存。

另外,在c / c ++语法中,通常括号如下:

for(int i = 0; i < NUM; i++)
{
   // Do stuff...
}

而不是Java方式:

for(int i = 0; i < NUM; i++){
   //Do stuff...
}