为什么这个例子会出现分段错误?

时间:2013-02-10 16:26:46

标签: c++ pointers segmentation-fault

有谁知道为什么会给我一个分段错误?

cell.h

struct cell{
  bool filled;
  bool isParent;
  //float px,py,pz,s;
  bool cx,cy,cz;
  unsigned char r,g,b;
  vect norm;
  struct cell* parent;
  struct cell* child;

  cell(bool cxx=0, bool cyy=0, bool czz=0);

  void open_read(string);
};

cell.cpp

cell::cell(bool cxx, bool cyy, bool czz)
{
  cell childs[8];     // these lines creates a segmentation fault
  child = &childs[0]; // these lines creates a segmentation fault
  cx=cxx;
  cy=cyy;
  cz=czz;
  norm = vect(0,0,0);
  norm.normalize();
  isParent=false;
  filled=true;
}

如果这是错误的方法,那么任何人都可以指出我如何将单个指针存储到子[8]的第一个元素,而不是存储8个指针,因为它非常占用内存。

2 个答案:

答案 0 :(得分:8)

您正在尝试设置无限递归。 cell的构造函数分配一个包含8个cell对象的数组,这些对象的构造依次使用默认参数调用cell的构造函数。

每个堆栈帧占用空间,由于非终止的调用递归,堆栈迟早会比其大小限制增长,最终导致分段错误。

答案 1 :(得分:3)

当您创建单个cell时,cell的构造函数会创建一个包含8个cell的数组。每个都创建一个8 cell s的数组,依此类推。你有无限的递归。

目前还不清楚为什么你的构造函数创建了一个包含8 cell s的数组 - 你只能获取第一个的地址。每个cell在构造时自动创建自己的子项也没有意义。这将导致cell s。

的无限束语

更不用说,在构造函数的末尾,cells的数组将被销毁,并且您将留下指向无效对象的指针。