1

功能是这样的:

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;
}

编辑:基于大量 cout 语句,错误似乎在这个函数中:

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

编辑:更改了数组索引,但仍然有段错误

4

2 回答 2

7

数组使用从零开始的索引,因此设置carr[2]为双长度数组中的任何内容都是未定义的行为。你应该感激这是一个段错误。:-)

尝试:

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

那应该处理段错误。

于 2010-12-01T15:56:16.200 回答
6
carr[1]=c4;
carr[2]=c5;

那不应该是

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

?

一条建议:如果你在调试器中加载它,比如 gdb,它会识别出罪魁祸首,你会很快看到你的错误。

于 2010-12-01T15:55:57.530 回答