Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个例子会出现分段错误?_C++_Pointers_Segmentation Fault - Fatal编程技术网

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

C++ 为什么这个例子会出现分段错误?,c++,pointers,segmentation-fault,C++,Pointers,Segmentation Fault,有人知道为什么这会给我一个分割错误吗 细胞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

有人知道为什么这会给我一个分割错误吗

细胞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的构造函数

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

创建单个单元格时,该单元格的构造函数会创建一个包含8个以上单元格的数组。每一个都会创建一个包含8个单元格的数组,以此类推。你有无限递归

尚不清楚为什么构造函数创建了一个由8个单元格组成的数组-您只获取其中第一个单元格的地址。在构造每个单元时,自动创建自己的子单元也是没有意义的。这将导致这种无限的细胞谱系


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

如果它最终停止,它实际上不是无限的……尽管以一种不公平的方式。@SteveWellens:对,我的意思是他正试图设置一个。但你是对的。我编辑了我的答案。哦,我应该已经看到了,我想我需要看看如何更改我的程序,这样我就不需要在实际需要之前调用孩子的构造函数了。@lasvig:是的。您可能只希望有一个指向子对象的指针集合我建议在这里考虑使用智能指针,智能指针可以在构建单元格对象后存储,也可以作为参数传入,但不能在创建单元格时创建,因为这又是一次建立无限递归的尝试。我之前有一个指针数组,但我现在要做的是将child简化为一个指针。所以我不需要使用64字节来存储8个指针。