Получение ошибки сегментации. Неверная запись в память размером 1 на Valgrind (CS50 PSET5 Speller) - PullRequest
0 голосов
/ 22 февраля 2020

Кажется, что не может сделать Valgrind счастливым.

Результат Valgrind:

== 21003 == Неверная запись размера 1 == 21003 == в 0x4C32E0D: strcpy (в / usr /lib/valgrind/vgpreload_memcheck-amd64-linux.so) == 21003 == by 0x40125E: загрузить (словарь. c: 111) == 21003 == 0x400964: основной (speller. c: 40) )

Неверная запись размером 8 == 22741 == при 0x40123E: загрузка (словарь. c: 107) == 22741 == по 0x400964: главная (speller. c: 40) == 22741 == Адрес 0x55cd9a0 составляет 32 байта, прежде чем нераспределенный блок размером 4 183 584 на арене «клиент»

Кажется, проблема в строке 110, которая является StrCpy в моей bool LOAD. Код как показано ниже - я не могу понять, почему существует недопустимая запись размером 1.

Другой вариант - n -> next = table [hashInt];

Я не понимаю, почему я Я получаю недопустимую запись.

bool load(const char *dictionary)
{

    FILE *file = fopen(dictionary, "r");

    if (file == NULL)
    {
        printf("error opening file");
        return 1;
    }

    char word [LENGTH + 1];

    while (fscanf(file, "%s\n", word) != EOF)
    {

        int hashInt = hash(word);

        node *n = malloc(sizeof(n));

        if (n == NULL)
        {
            unload();
            return 1;
        }

        if (table[hashInt] == NULL)
        {
            table[hashInt] = n;
        }
        else
        {
            n -> next = table[hashInt];
            table[hashInt] = n;
        }

        strcpy(n -> word, word);
        wordLoaded++;
    }
    fclose(file);
    return 0;
}

1 Ответ

1 голос
/ 22 февраля 2020

Это node *n = malloc(sizeof(n));, вероятно, опечатка. Вы имели в виду sizeof(node)?

...