在功能中丢失指针信息

时间:2016-07-29 18:43:50

标签: c pointers pass-by-value function-calls

我正在为我的编程主题做练习,它是一个医院Manegment计划。在程序的开头,我需要将信息从.txt发送到动态结构。我在过去的几个小时里一直在为什么要丢失数据。

退出此功能后,为什么我的头指针为空,我尝试将其打印出来?不应该指针保留信息。

提前致谢。 Ps:如果您对我的算法有任何提示,请随意说。

void dump_med(struct medico *head_m)
{
    int i = 1;
    struct medico *new_med;
    struct medico *temp_m;

    FILE *f = fopen(M_FILE, "r");
    new_med = malloc(sizeof(struct medico));
    temp_m = malloc(sizeof(struct medico));

    if(f == NULL)
    {
        printf("Erro a abrir o ficheiro\n");
        return;
    }

    if( new_med == NULL || temp_m == NULL)
    {
        printf("Erro a alocar a memória\n");
        return;
    }
    while(!feof(f))
    {   
        new_med = realloc(new_med, sizeof(struct medico) * i);
        if( new_med == NULL)
        {
            printf("Erro a realocar a memória\n");
            return;
        }
        fscanf(f, "%[^\n]", new_med->nome);
        fscanf(f, "%s %d.%d--%d.%d\n", new_med->especialidade, &(new_med->entrada.h), 
            &(new_med->entrada.m), &(new_med->saida.h), &(new_med->saida.m));
        temp_m = new_med;
        temp_m->next = head_m;
        head_m = temp_m;
        new_med = new_med->next;
        i++;

    }
    free(new_med);
    free(temp_m);
    fclose(f);
}

2 个答案:

答案 0 :(得分:1)

在C中,所有参数都按值传递。因此,在修改head_m时,您只需修改本地变量。

如果要在调用函数中反映更改,请传递相关变量的地址,然后取消引用函数中的指针变量。

void dump_med(struct medico **head_m)
{
    ...
    temp_m->next = *head_m;
    *head_m = temp_m;
    ...
}

然后你这样称呼它:

dump_med(&head_m);

答案 1 :(得分:1)

C使用pass-by值进行函数参数传递。如果您要修改函数内的head_m,它将不会反映到实际参数中。你需要

  • 将指针传递给要修改的指针
  • 拥有return语句,返回新的

那就是说,

  1. 请参阅Why is “while ( !feof (file) )” always wrong?
  2. 请务必检查scanf()及其家人的返回值。