Ошибка выделения памяти при построении узла - PullRequest
1 голос
/ 24 февраля 2012

Я реализовал двоичную кучу в виде дерева, а узел дерева выглядит следующим образом;

struct tree_node {
    char* p_word;
    int count;
    struct tree_node* parent;
    struct tree_node* p_left;
    struct tree_node* p_right;
};

Все работает отлично, пока не доходит до члена char *. Когда я пытаюсь выделить некоторое пространство памяти для p_word, во время выполнения мне выдается «Ошибка сегментации».

fgets(buffer, BUFFERSIZE, fp);
for(tok = strtok(buffer, " "); tok; tok = strtok(0, " ")) {
    if(tok) {
        curr = (lpnode)malloc(sizeof(node));
        curr->p_left = curr->p_right = NULL;
        curr->count = 1;

        curr->p_word = (char*)malloc(sizeof(char) * strlen(tok));
        strcpy(curr->p_word, tok);

        insert(&root, &root, curr);
    }
}
fclose(fp);

Обратите внимание, что curr представляет узел, который будет добавлен к дереву, а root представляет корневой узел дерева.

Как я могу преодолеть эту проблему, не вызывая утечки памяти?

Ответы [ 5 ]

0 голосов
/ 26 февраля 2012

Ах, наконец, я решил это; проблема была внутри функции вставки. Я обнаружил, что пытался преобразовать целочисленный параметр в указатель на символ. Это ошибка отладки, позор мне :) В любом случае, спасибо всем, ребята.

0 голосов
/ 24 февраля 2012
  1. Убедитесь, что fgets возвращает не NULL.Если он возвращает NULL, то буфер не может быть завершен с помощью '\ 0'.
  2. Убедитесь, что типы верны для 'curr = (lpnode) malloc (sizeof (node));'Какой это тип?Я ожидал бы "struct tree_node".
  3. Размер строки strlen (tok) + 1!Также нет причин для умножения на sizeof (char) по определению 1.
  4. Убедитесь, что malloc возвращает действительный блок памяти
0 голосов
/ 24 февраля 2012

Возможно, проблема в strtok..Проверьте «tok» и посмотрите, не завершено ли оно NULLstrlen не работает с ненулевыми терминированными символами.Также обратите внимание, что strtok изменяет строку в процессе токенизации.Желательно скопировать строку во временный буфер перед началом цикла.Пожалуйста, обратите внимание на эту проблему strtok при вызове

0 голосов
/ 24 февраля 2012

убедитесь, что tok является правильной строкой, убедитесь, что strlen(tok) не является ни отрицательным, ни невероятно большим (может быть подразумевено предыдущим тестом) и что malloc фактически возвращает некоторую память (без замены этого теста).1004 *


попробуйте

curr->p_word = (char*)malloc(sizeof(char) * (strlen(tok)+1));
strcpy(curr->p_word, tok);
0 голосов
/ 24 февраля 2012

Вы должны проверить, что strlen(tok) положительно.В противном случае вы попытаетесь выделить 0 байтов.malloc в свою очередь возвращает NULL, чтобы указать успешное выделение 0 байтов.После этого вы отменяете указатель на NULL и вылетаете.Что касается того, как это преодолеть, ну ... вам нужно либо поддерживать p_word как ноль, либо выделять strlen(tok) + 1 байт, например, чтобы хранить \0 только для пустых строк.

...