C-尝试加载链接列表时的malloc崩溃



我正在尝试从文本文件中初始化链接列表,这是我的结构:

typedef struct Diagnostic
{
    char* disease;
    int priority;
}Diagnostic;
typedef struct Fiche Fiche;
struct Fiche
{
    char* name;
    int age;
    Diagnostic diagnostic;
    Fiche* next; // because this is a linked list
};

这是我的负载功能:

void loadFiches()
{
    int i;
    char tmp1[100], tmp2[100];
    Fiche* current;
    FILE* file = fopen("fiches.txt", "r");
    if(file != NULL)
    {
        while(!feof(file))
        {
            printf("malloc:");
            current = malloc(sizeof(Fiche)); // allocate memory for a new fiche
            printf("%pn", current);
            fgets(tmp1, 100, file); // get the name
            cleanChar(tmp1); // remove 'n'
            fscanf(file, "%dn", &current->age); // get the age
            fgets(tmp2, 100, file); // get the disease
            cleanChar(tmp2); // remove 'n'
            fscanf(file, "%dn", &current->diagnostic.priority); // get the priority
            current->diagnostic.disease = malloc(strlen(tmp2) * sizeof(char)); // allocate memory for the disease
            strcpy(current->diagnostic.disease, tmp2); // copy the disease in the corresponding field
           // Then I add this fiche to my linked list
        }
    }
    else printf("error");
    fclose(file);
}

输出是

malloc:00350FD8
malloc:00350FF8
malloc:

因此,它在第三个杂货店坠毁。请注意,我仅初始化疾病领域,因为那是导致崩溃的疾病领域,其他一切正常,因此在此代码中不会出现。另请注意,在调试模式下,一切都很好。

,如果我删除了 cleanChar(tmp2);strcpy(current->diagnostic.disease, tmp2);,则它也可以正常工作(但在第一种情况下我有不需要的 n(,这是两行的组合导致崩溃。

这是我的CleanChar功能:

void cleanChar(char string[100])
{
    int i;
    for(i = 0; i < strlen(string); i++)
        if(string[i] == 'n') string[i] = '';
}

有人对可能导致坠机的原因有一个想法吗?我很确定这与我将FICHES保存到文本文件的方式无关,但这是保存功能:

void saveFiches(List list)
{
    int i;
    Fiche* current = list.first;
    FILE* file;
        file = fopen("fiches.txt", "w+");
        if(file != NULL)
        {
            for(i = 0; i < list.size; i++)
            {
                fprintf(file, "%sn%dn%sn%dn", current->name, current->age, current->diagnostic.disease, current->diagnostic.priority);
                current = current->next;
            }
        }
        else printf("error");
        fclose(file);
}

List是一个包含我链接列表的第一个元素的结构。

您的字符串 malloc()不在一个(您不考虑终止''

(
current->diagnostic.disease = malloc(strlen(tmp2) * sizeof(char));

应该是:

current->diagnostic.disease = malloc((strlen(tmp2) + 1) * sizeof(char));

和,由于 sizeof(char)始终是 1,这可能是:

current->diagnostic.disease = malloc(strlen(tmp2) + 1);

除非您想通过确定分配给的指针来确定适当的大小,否则要使malloc()更强大:

current->diagnostic.disease = malloc((strlen(tmp2) + 1) *
  sizeof(*(current->diagnostic.disease)));

您也可以复制字符串:

current->diagnostic.disease = strdup(tmp2);

无论您做哪种方式,不要忘记检查NULL

的结果

相关内容

  • 没有找到相关文章

最新更新