Почему эта функция segfaulting? - PullRequest
1 голос
/ 01 декабря 2010

Функция такова:

Set::Set(Multinumber* tempArray[], int tempSize)
{
 numElements = tempSize;
 capacity = tempSize*2;
 setArray = new Multinumber*[capacity];
 for (int i=0; i<numElements; i++)
 {
  addElement(tempArray[i]);
 }
}

В моем заголовке объявлена ​​переменная setArray типа Multinumber **

Он вызывает ошибки всякий раз, когда я называю это следующим:

Multinumber* carr[2];
carr[0]=c4;
carr[1]=c5;
Set setb(carr,2);

c4 и c5 уже объявлены указателями на объекты соответствующего типа.

Любая помощь будет высоко ценится.

РЕДАКТИРОВАТЬ: код ниже является функцией addElement (извинения за отступ)

const Set Set::operator+(const Set& rhs) const
{
 Set result;
 int i=0, j=0;

 while ((i < numElements) && (j < rhs.numElements))
 {
  Multinumber* toadd=new Multinumber;
  toadd=*(setArray[i]) + *(rhs.setArray[j]);
  result.addElement(toadd);
  i++;
  j++;
 }

 while ((i < numElements))
 {
  result.addElement(setArray[i]);
  i++;
 } 


 while ((j < rhs.numElements))
 {
 result.addElement(rhs.setArray[j]);
 j++;
 }


 return result;
}

EDIT: Судя по многочисленным заявлениям cout, в этой функции, похоже, ошибка:

 bool Set::isFull()
 {
  return (numElements == capacity);
 }

РЕДАКТИРОВАТЬ: Изменены индексы массива, но все еще segfaults

Ответы [ 2 ]

7 голосов
/ 01 декабря 2010

Массивы используют индексы, начинающиеся с нуля, поэтому установка carr[2] для чего-либо в массиве из двух длин является неопределенным поведением.Вы должны быть благодарны за это.: -)

Попробуйте:

Multinumber* carr[2];
carr[0]=c4;
carr[1]=c5;
Set setb(carr,2);

Это должно позаботиться о segfault.

6 голосов
/ 01 декабря 2010
carr[1]=c4;
carr[2]=c5;

Разве это не должно быть

carr[0]=c4;
carr[1]=c5;

Совет: если вы загрузите его в отладчике, например, в gdb, он определит линию виновника, и вы очень быстро увидите свою ошибку.

...