c - 在 sprintf 中使用节点元素



所以我一直在尝试让程序的这一部分读取包含这种格式的名称和数字的特定文件

姓名编号

等,并将它们存储在结构列表中

void read_data(char *filename, list *mylist) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        printf("Can't open filen");
        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;
};

瓦尔格林德显示:

==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

任何关于我的错误在哪里的提示将不胜感激:)

使用 list_element* element = malloc(sizeof(list_element)); 时,您正在为 list 元素分配空间,但不为 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

最新更新