总线错误 c++ 运行 正确使用小数组,运行 时间错误使用大数组

Bus error c++ Run correctly with small array, run time error with big array

谁能帮帮我?当 hashSize 较小时,printAll()、listprintAll() 和 sizeLL() 可以正常工作,但不适用于大数字,例如数字 9973。

printAll() 和 hashStats() 都是 Class Table 中的方法,printALL() 调用 listprintAll() 和 hashStats() 从另一个结构调用 sizeLL()。

所有函数都可以在给定小 hashSize 的情况下正常工作。

对图片感到抱歉并且感到困惑。第一次来这里..我正在使用 MacBook 来完成这项工作。

在list.h

struct Node{  

  string key;
  int value;

  Node *next;

  Node(const string &theKey, int theValue);

  Node(const string &theKey, int theValue, Node *n);



    };

typedef Node * ListType;

在Table.h

class Table {
public:

  static const int HASH_SIZE = 9973;  // a prime number

   // create an empty table, i.e., one where numEntries() is 0
   // (Underlying hash table is HASH_SIZE.)
   Table();

   // create an empty table, i.e., one where numEntries() is 0
   // such that the underlying hash table is hSize
   Table(unsigned int hSize);

  unsigned int hashSize;      // size of the hash table
  ListType * data;           // (used in hashCode method above)
}

在list.cpp

void listprintAll(ListType list){

if(list ==NULL) {
  cout << "[ ]" <<endl;
  return;}
 else{
Node * p=list;
while(p!= NULL){
  cout << p->key << " " << p->value << ",";
   p=p->next;
}
 cout <<endl;
 return;
 }
}

int sizeLL(ListType list){

if(list ==NULL) {
  return 0;}

 else{
int count=0;
Node * p=list;

while(p!= NULL){
   p=p->next;
   count++;
}
 return count;
}

在Table.cpp

Table::Table() {
  hashSize=HASH_SIZE;
  data = new ListType[hashSize];

}


Table::Table(unsigned int hSize) {
  hashSize=hSize;
  data = new ListType[hashSize];

}


void Table::printAll() const {

  for(int i=0;i<hashSize;i++){   
    listprintAll(data[i]);
  }
}

void Table::hashStats(ostream &out) const {

  out << "number of buckets: "<< hashSize <<endl;
  int number = numEntriesOfTable();
  out << "number of entries: "<< number <<endl;

  int countN0=0;
  int longest=0;
  int temp;

  if(number!=0){    
    for(int i=0;i<hashSize;i++){
      temp=sizeLL(data[i]);
      if(temp!=0){
    countN0++;
        if(temp > longest){
    longest=temp;
      }
      }
    }
  }
  out << "number of non-empty buckets: "<< countN0 << endl;
  out << "longest chain : "<< longest << endl;





}

您在构造函数中为 data 分配内存但未对其进行初始化。这会使您的所有指针都带有不确定的值,这些值可能是 0/NULL,也可能是其他一些随机指针值。当您尝试取消引用这些时,您会崩溃。

您需要使用循环 memset 或类似的方法将构造函数中分配的内存清零。