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

first part of output is correct then I get a segmentation fault?

本文关键字:一个 错误 分段 一部分 第一部 输出 然后      更新时间:2023-10-16

我正在尝试使用函数输出向量的值。"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
    }

vector s在索引到时不会自动增长,如果要将项附加到向量的末尾,请使用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的循环也可以重写为基于范围的循环矢量(10);

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

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

auto lv = gv;
auto lv2 = a;

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

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...
}
相关文章: