C-函数可能发生堆栈溢出

时间:2011-05-07 06:23:18

标签: c stack-overflow

我正在编写一个HashTable程序,其中HashTable充满了LinkedLists,它计算文件的单词频率。在程序的最终实现中,允许用户通过命令行参数选择链表的链大小,其中任何其他命令行参数假定为需要处理的文件。

现在我从我的搜索功能得到一个堆栈溢出问题,以确定该单词是否已经在表中,我不知道如何解决它。我对程序说它可能过流

在我向哈希表添加另一个节点之前,我调用一个方法,如果找到该单词则返回1,如果找不到则返回0。这是电话:

 inFile = searchFile(table, data);

表是HashTable,数据是单词

searchFile,它调用的是我的List类的一部分

 int searchFile(HashTablePtr table, char *data) {
     ListPtr tempList;
     HashObjectPtr obj;
     int i;

     for (i = 0; i < table->size; i++) {
         tempList = table->table[i];
         if (tempList->size > 0) {
             obj = search(table->table[i], data);
            if (obj != NULL) {
                obj->frequency++;
                return 1;
            }
        }

    }
    return 0;
}

列出搜索功能

 HashObjectPtr search(ListPtr list, char *data) {
     int num = list->size;
     int i;

     NodePtr tempNode;
     HashObjectPtr tempObj;

     tempNode = list->head;

     for (i = 0; i < num; i++) {
         tempObj = tempNode->HashObject;
         while (tempNode != NULL) {
             if (strcmp((char *) tempObj->obj, data) == 0) {
                return tempObj;
             } else {
                tempNode = tempNode->next;
             }
         }
     }

    return NULL;
}


我之前在此程序的实现中使用了HashObjectPtr搜索功能,没有任何问题,我不确定为什么它会立即创建溢出。

HashObject

 struct hashobject {
     int frequency;
     void *obj;

     char (*toString)(void *obj);
 };

HashTable

 struct hashtable {
      int size;
      ListPtr *table;
 };

Lise

 struct list {
     int size;
     NodePtr head;
     NodePtr tail;
 };

我不完全确定它是堆栈溢出,因为所有valgrind真正显示的是几个单词已经进入然后我得到了分段错误错误。我已经通过调试器运行了它,但在经过大约12次迭代的for循环后,它在我的搜索功能中失败了。

1 个答案:

答案 0 :(得分:2)

一个细节,我不知道它是否能解决你的问题。在原始循环中:

     tempObj = tempNode->HashObject;
     while (tempNode != NULL) {
         if (strcmp((char *) tempObj->obj, data) == 0) {
            return tempObj;
         } else {
            tempNode = tempNode->next;
         }
     }

您将tempObj分配给第一个 tempNode。然后,您将遍历所有节点。除了没有找到除第一个节点之外的任何内容之外,当列表为空时它将不起作用。

相反,将它放在循环旁边:

     while (tempNode != NULL) {
         tempObj = tempNode->HashObject;
         if (strcmp((char *) tempObj->obj, data) == 0) {
            return tempObj;
         } else {
            tempNode = tempNode->next;
         }
     }
相关问题