C- Возможно переполнение стека от функции - PullRequest
2 голосов
/ 07 мая 2011

Я пишу программу HashTable, в которой HashTable полон LinkedLists, который считает частоту слов в файле.В окончательной реализации программы пользователю разрешается выбирать размер цепочки связанного списка через аргумент командной строки с любыми другими аргументами командной строки, которые предполагаются как файлы, которые должны быть обработаны.

RightТеперь я получаю проблему с переполнением стека из функции поиска, чтобы определить, есть ли слово в таблице или нет, и я не уверен, как это исправить.Я выполняю программу, в которой говорится, что это возможно из-за переполнения

Прежде чем добавить еще один узел в хеш-таблицу, я вызываю метод, который возвращает 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 Ответ

2 голосов
/ 07 мая 2011

Одна деталь, я не знаю, решит ли она вашу проблему.В исходном цикле:

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

Вы назначите tempObj для first tempNode.Затем вы пройдете через все узлы.В дополнение к тому, что ничего не найдено, кроме первого узла, оно не будет работать, когда список пуст.

Вместо этого поместите его в сторону цикла:

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