0

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

细胞.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);
};

细胞.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;
}

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

4

2 回答 2

8

您正在尝试设置无限递归。的构造函数cell分配一个由 8 个对象组成的数组cell,其构造依次调用cell具有默认参数的构造函数。

每个堆栈帧都会消耗空间,并且由于未终止的调用递归,堆栈迟早会变得大于其大小限制,最终导致分段错误。

于 2013-02-10T16:29:00.207 回答
3

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

尚不清楚为什么您的构造函数会创建一个 8 cells 的数组 - 您只获取其中第一个的地址。cell每个人在构建时自动创建自己的孩子也是没有意义的。这将导致cells 的无限血统。

更不用说,在您的构造函数结束时,数组cells将被销毁,您将留下一个指向无效对象的指针。

于 2013-02-10T16:30:00.190 回答