Использование элемента node внутри sprintf - PullRequest
0 голосов
/ 04 февраля 2019

поэтому я пытался заставить эту часть программы прочитать конкретный файл, который содержит имена и цифры в этом формате

номер имени

и т. Д.,и сохраните их в списке структуры

void read_data(char *filename, list *mylist) {
    FILE *file = fopen(filename, "r");

    if (file == NULL) {
        printf("Can't open file\n");
        exit (1);
    }

    char pass[100];
    int  order;
    char line[1000];

    while (fgets(line, 1000, file) != NULL) {
        list_element *element = malloc(sizeof(list_element));
        sscanf(line, "%s %d", pass, &order);
        sprintf(element->password, "%s", pass);
        element->count = order;
        element->next = NULL;
        insert_front(element, mylist);
    }
    fclose(file);
}

sprintf продолжает сбой программы с ошибкой сегментации.Я пробовал snprintf, и у меня все та же проблема.Я не могу использовать буфер, поскольку в этой конкретной задаче мне не разрешено использовать <string.h>, поэтому strcpy не является опцией

Сама структура:

struct list_element {
    char *password;
    int count;
    list_element* next;
};

Valgrind показывает:

==25999== Conditional jump or move depends on uninitialised value(s)
==25999==    at 0x4ECC374: _IO_str_init_static_internal (strops.c:51)
==25999==    by 0x4EBD6C2: vsprintf (iovsprintf.c:41)
==25999==    by 0x4EA1093: sprintf (sprintf.c:32)
==25999==    by 0x4008E7: read_data 
==25999==    by 0x400B80: main 
==25999==  Uninitialised value was created by a heap allocation
==25999==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==25999==    by 0x400898: read_data 
==25999==    by 0x400B80: main

Любые советы о том, где моя ошибка будет принята:)

1 Ответ

0 голосов
/ 04 февраля 2019

С list_element* element = malloc(sizeof(list_element)); вы выделяете место для элемента списка, но вы не выделяете место для пароля, на который должен указывать элемент password.Таким образом, ваш sprintf(element->password,"%s", pass); запишет в память, которую вы не распределили.

Либо выделите место до sprintf (Кстати: strcpy также выполнит эту работу):

element->password = malloc(strlen(pass)+1);
// sprintf(element->password,"%s", pass);
strcpy(element->password,pass);

или напишите ...

element->password = strdup(pass);

так, чтобы достаточно места для хранения содержимого pass было зарезервировано до того, как содержимое pass 'скопировано в это пространство.

...