矢量分割故障的向量

时间:2018-03-29 18:45:47

标签: c++ vector segmentation-fault

当我尝试为此向量矢量赋值时,我一直遇到分段错误。我基本上是从图像中读取像素,然后尝试创建矢量矢量,您可以访问该行,然后访问该行上的像素以获取该点中的像素。但是当我尝试将特定像素分配给像素值时,它会给我一个分段错误。我使用{255,255,255}的占位符作为示例像素,但我打算使用这个 - > PIX [num_pix] .r()如果我可以使它工作,这基本上是我的Image类中的像素getter,其中num_pix是它迭代的当前像素。

vector<vector<Pixel>> Image::as_rows(){
  vector<vector<Pixel>> pixels;
  int i,k,height, width,pix_num;
  pix_num=0;
  height = this->HDR.height();
  width = this->HDR.width();
  for(i=0;i<height;i++){
    for(k=0;k<width;k++){
       pix_num++;
       pixels[i][k] = {255,255,255};
    }
  }
  return pixels;
}

3 个答案:

答案 0 :(得分:2)

您的向量当前为空,这意味着当您尝试分配给您不拥有的内存(使用pixels[i][k] = {255, 255, 255})时,您将有未定义的行为。

您可以在声明对象时使用正确数量的对象初始化矢量:

vector<vector<Pixel>> pixels(height, vector<Pixel>(width));

此外,对于将来,您可以使用.at()而不是下标运算符来强制执行边界检查并避免使用UB。

答案 1 :(得分:0)

您有一个您尝试访问的空向量,这是未定义的行为。您必须先分配元素,然后才能通过索引访问它们,就像您尝试做的那样。在开始时使用正确数量的对象初始化矢量的替代方法是在需要时push_back对象。使用Pixel对象的向量向量,您将需要填充此类内容。

std::vector<std::vector <Pixel> > pixels;
for(i=0;i<height;i++)
{
    pixels.push_back(std::vector<Pixel>());
    for(k=0;k<width;k++)
    {
        pix_num++;
        pixels[i].push_back({255,255,255});
    }
}

答案 2 :(得分:0)

您的问题是pixels是一个空向量。它的元素是vector<Pixel> - 但它没有任何元素。廉价而愉快的解决方案是首先计算heightwidth,然后使用足够大小的元素构建pixels

    const int height = this->HDR.height();
    const int width  = this->HDR.width();
    std::vector<std::vector<Pixel>> pixels(height, {width, {0,0,0}});

然而,这将具有可怕的内存位置属性。我强烈建议你写一个Bitmap类,它将x,y映射到单个向量中的偏移量,并用宽度和高度构造。