2013-06-17 2 views
2

Почему возникает ошибка сегментации в следующем коде?Выделение массива в конструкторе структуры

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

Просто сделайте соседи указателями на ячейку и с помощью функции вне конструктора создайте их с помощью «нового» или создайте их один за другим, когда они вам понадобятся. –

ответ

5

Вы написали бесконечно рекурсивную функцию. Ваш конструктор Cell::Cell косвенно вызывает себя полностью new выражение, которое в свою очередь вызывает снова Cell::Cell ... Это в конечном итоге приводит к переполнению стека и сбою.

(Кроме того, не представляется возможным, чтобы иметь явный массив Cell объектов внутри Cell объекта. Такая структура данных будет бесконечно вложенными, т.е. он будет иметь бесконечный размер.)

Обратите внимание, что нет ничего вообще неправильно с рекурсией как таковой. Но в какой-то момент это должно закончиться. Если вы хотите рекурсивно построить свое дерево, вы можете сделать это, но вы должны убедиться, что ваша рекурсия отстает в той или иной точке. То есть ваше дерево должно иметь листовые узлы. Теперь у вас есть дерево без листовых узлов. Это бесконечная рекурсия, которая пытается построить бесконечно большое дерево. Это невозможно. Это не имеет никакого смысла.

Когда пришло время строить ваши листовые узлы - только вы можете ответить. Мы не знаем, какое дерево вы пытаетесь построить.

+0

ok в структуре данных дерева каждый узел имеет узловые указатели на дочерние узлы, у меня есть такая же концепция здесь, как я могу избежать такой рекурсии ?? –

+0

@Ahmed Kato: Вы можете сделать это, взяв «новый» из конструктора. Сначала закончите свой конструктор. Затем вы можете выделить узлы. – AnT

+0

Я сделал что-то, и он работает, создавая новый contructor, который принимает число как аргумент, чтобы при вызове конструктора по умолчанию их не было рекурсией. –

6

Если вы s в Cell 'конструктор s вы вызываете больше 3 Cell' s конструкторами. Каждый из этих 3 затем называет еще 3 и так далее. Пока ... подождите ... переполнение стека. Ура. Это бесконечно.

+0

Так как я могу избежать этой рекурсии ?? –

+0

Вместо этого соседи располагают массивом из 3 указателей, поскольку для ячейки нет смысла иметь в ней 3 реальных других ячейки. Затем в своем конструкторе или в другом месте переместите указатели вверх. –

0

Поскольку конструктор вызывает себя три раза за экземпляр, вы в основном создаете бесконечный цикл из-за бесконечной рекурсии. Вот где ваша проблема.

Смежные вопросы