2013-06-17 10 views
2

다음 코드에서 세그먼트 화 오류가 발생하는 이유는 무엇입니까? 나는 정적 배열을 사용하는 경우 Cell에서 당신 new 3 Cell의의 생성자의 생성자는 3 개 Cell를 호출하는 '경우구조체의 생성자에 배열 할당

struct Cell 
    { 
     cellMode mode; 
     bool visited; 
     //bool scanned; 
     int rowIndex; 
     int colIndex; 
     Cell *neighbours;//if using Cell neighbours[3] i am getting a compilation error 

     Cell() 
     { 
      neighbours = new Cell[3];//seg fault here 
     } 
    }; 

, 나는 다음과 같은 오류를

neighbours has incomplete type

+3

"셀"이 할당 될 때마다 해당 생성자가 호출됩니다. 즉, 첫 번째 생성자는 세 번 더 할당 할 때마다 종료되지 않습니다. –

+2

그냥 이웃을 Cell에 대한 포인터로 만들고 생성자 외부의 함수로 "new"로 생성하거나 필요할 때마다 하나씩 생성하십시오. –

답변

5

무한 재귀 함수를 작성했습니다. Cell::Cell 생성자는 간접적으로 new 표현식을 통해 간접적으로 자신을 호출합니다.이 표현식은 다시 Cell::Cell을 다시 호출합니다. 결국 스택 오버플로 및 충돌이 발생합니다.

(또한, Cell 개체 내부 Cell 객체들의 명시적인 배열을 가질 수 없다.이 무한 크기를 갖는 것, 즉 이러한 데이터 구조는 무한 중첩 될 것이다.) 것이 일반적이 없다는 것을

참고 재귀 자체가 잘못되었습니다. 그러나 그것은 어느 시점에서 끝나야합니다. 트리를 재귀 적으로 빌드하려는 경우 그렇게 할 수 있지만 재귀가 한 지점 또는 다른 지점에 있는지 확인해야합니다. 나는. 당신의 나무는 의 잎 노드을 가지고 있어야합니다. 지금 당신이 가진 것은 잎 노드가없는 나무입니다. 무한히 큰 나무를 만들려고하는 무한 재귀입니다. 이건 불가능 해. 그것은 말도 안돼.

리프 노드를 만들 때만 대답 할 수 있습니다. 우리는 당신이 만들고자하는 나무의 종류를 모른다.

+0

트리 데이터 구조에서 ok 각 노드는 자식 노드에 노드 포인터가 있습니다. 여기에 같은 개념이 있습니다. 어떻게 그러한 재귀를 피할 수 있습니까 ?? –

+0

@Ahmed Kato : 생성자에서 'new'를 취하면됩니다. 먼저 생성자를 완성하십시오. 그런 다음 노드를 할당 할 수 있습니다. – AnT

+0

나는 무언가를했으며, 디폴트 생성자를 호출 할 때 재귀가되지 않도록 숫자를 인수로 취하는 새로운 생성자를 만들고있다. –

6

를 얻을. 그 3 명 각각은 3 명을 더 호출합니다. 그 때까지 ... 스택 오버 플로우. 만세. 그것은 무한합니다.

+0

그래서 어떻게이 재귀를 피할 수 있습니까 ?? –

+0

이웃 셀에 3 개의 포인터가있는 배열을 만드는 대신 셀에 실제 다른 3 개의 셀을 포함시키는 것이 바람직하지 않습니다. 그런 다음 생성자 또는 다른 곳에서 포인터를 연결하십시오. –

0

생성자가 인스턴스 당 세 번 호출하므로 기본적으로 끝나지 않는 재귀로 인해 무한 루프가 생성됩니다. 그것은 당신의 문제가있는 곳입니다.