【问题标题】:Losing pointer information in function在函数中丢失指针信息
【发布时间】:2016-12-04 13:42:22
【问题描述】:

我正在为我的编程主题做一个练习,这是一个医院管理程序。在程序开始时,我需要将信息从 .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);
}

【问题讨论】:

  • 我质疑您在这里尝试构建前向链表的机制。有很多,很多更简单的方法可以做到这一点。
  • 如果你能指导我采用一种更简单的方法,那是我第 5 次尝试链表,其他时候我总是失去头部位置,我将不胜感激。
  • Something like this,使用提供的文件名和将接收正在生成的列表的节点指针的地址调用。祝你好运。任何未来的“这怎么能更好”的问题都应该被强加给codereview.stackexchange.com
  • 哇,它真的更简单更清晰!我将尝试将其调整为我的代码并检查 codereview。谢谢!!!

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


【解决方案1】:

在 C 中,所有参数都是按值传递的。所以修改head_m时,只是修改了一个局部变量。

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

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

那你这样称呼它:

dump_med(&head_m);

【讨论】:

    【解决方案2】:

    C 使用传递值来传递函数参数。如果要修改函数内部的head_m,它不会反映到实际参数中。您需要

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

    也就是说,

    1. 请看Why is “while ( !feof (file) )” always wrong?
    2. 始终检查scanf() 和family 的返回值。

    【讨论】:

    • 感谢您的提示,我将尝试停止使用 feof,并且当我几乎完成程序的基本框架时,我习惯于更深入地检查 scanf() 的返回值
    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 2013-01-18
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2014-03-26
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多