【问题标题】:Segmentation fault: 11 while printing dynamic arrays分段错误:打印动态数组时出现 11
【发布时间】:2015-02-08 15:12:00
【问题描述】:

我有一个简单的 C++ 代码,我将动态数组定义为:

std::vector<double>IPWeights;

然后将它传递给一个名为reference的函数,并带有一个引用(所以我改变了它的内容),例如:

void reference (std::vector<double> &IPWeights)

然后在我的主函数中,在我更改了数组内容后,我想打印它:

int size_weights=IPWeights.size();

for (int i=0; i<size_weights; i++)
{
    std::cout<<IPWeights[i]<<std::endl;
}

但在屏幕上我只看到“segmentation fault 11”。

引用的位置如下所示:

void reference( std::vector<double> &IPWeights)
{
    IPWeights[0]=0.4500;
    IPWeights[1]=0.2648;
    IPWeights[2]=0.2648;
    IPWeights[3]=0.2648;
    IPWeights[4]=0.2519;
    IPWeights[5]=0.2519;
    IPWeights[6]=0.2519;
}

感谢任何建议, 提前致谢。

【问题讨论】:

  • “有人知道这是为什么吗?” 似乎不是您实际显示的代码。请发一个minimal sample,它会重现问题。
  • 将 int 更改为 size_t 以获得 size_weights。它可以解决您的问题。
  • @Sergey 谢谢,但没有帮助:(
  • Anyone knows why that is?? 很可能是由于您的代码中的错误。
  • 这可能意味着 reference 或您未向我们展示的其他代码正在尝试访问超出向量大小的元素(或者可能对于 int 来说太大了- 使用size_t 或迭代器)。但是,从您向我们展示的代码中无法猜测为什么会发生这种情况。使用您的调试器或 Valgrind 之类的工具来准确查找段错误发生的位置。

标签: c++ arrays dynamic


【解决方案1】:

我的水晶球说你没有为向量分配内存。您应该执行以下操作之一:

  • 用适当的大小初始化向量:

    std::vector<double> IPWeights(size_you_need);
    
  • 在分配给它之前调用IPWeights.resize():

    std::vector<double> IPWeights;
    IPWeights.resize(size_you_need);
    
  • 调用IPWeights.push_back()而不是按索引分配:

    IPWeights.push_back(0.4500);
    IPWeights.push_back(0.2648);
    //...
    

【讨论】:

  • 使用第三个选项,因为我希望我的代码更通用,并且使用 push_back 而不是 index 是有效的,谢谢 :)
猜你喜欢
  • 1970-01-01
  • 2021-02-16
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多