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

Why would this example give a segmentation fault?

本文关键字:分段 错误 为什么      更新时间:2023-10-16

有人知道为什么这会给我带来分段错误吗?

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;
}

如果这是错误的方法,那么有人能给我指明正确的方向,告诉我如何存储指向child[8]的第一个元素的单个指针,而不是存储8个指针,因为这相当占用内存。

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

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

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

目前尚不清楚为什么您的构造函数会创建一个由8个cell组成的数组——您只需要获取其中第一个的地址。每个cell在构造时自动创建自己的子级也是没有意义的。这将导致cell s的无限谱系。

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