0

なぜこれが私にセグメンテーション違反を与えるのか誰かが知っていますか?

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個のポインタを格納する代わりに、child[8]の最初の要素への単一のポインタを格納する方法について誰かが正しい方向に向けることができます。

4

2 に答える 2

8

無限再帰を設定しようとしています。のコンストラクターはcell、8つのオブジェクトの配列を割り当てます。そのコンストラクターは、デフォルトの引数を使用しcellてのコンストラクターを呼び出します。cell

各スタックフレームはスペースを消費し、遅かれ早かれ、呼び出しの再帰が終了しないためにスタックがサイズ制限よりも大きくなり、最終的にセグメンテーション違反が発生します。

于 2013-02-10T16:29:00.207 に答える
3

単一のを作成するとcell、そのcellコンストラクターはさらに8つのの配列を作成しますcellcellそれらのそれぞれは、8秒などの配列を作成します。無限の再帰があります。

コンストラクターが8の配列を作成する理由は不明cellです。つまり、最初のアドレスのみを取得します。cellまた、構築時にそれぞれが自動的に独自の子を作成することも意味がありません。それはsのこの無限の系統につながりcellます。

言うまでもなく、コンストラクターの最後で、の配列cellsが破棄され、無効なオブジェクトへのポインターが残ります。

于 2013-02-10T16:30:00.190 に答える