在函数中丢失指针信息
Losing pointer information in function
我正在为我的编程主题做练习,这是一个医院管理程序。在程序的开头,我需要将信息从 .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);
}
在C语言中,所有参数都是按值传递的。所以当修改head_m
时,你只是在修改一个局部变量。
如果您希望更改反映在调用函数中,请传递相关变量的地址,然后在函数中取消引用指针变量。
void dump_med(struct medico **head_m)
{
...
temp_m->next = *head_m;
*head_m = temp_m;
...
}
然后你这样称呼它:
dump_med(&head_m);
C 使用传递值进行函数参数传递。如果您要在函数内部修改 head_m
,它不会反映到实际参数中。您需要
- 将指针传递给要修改的指针。
- 有一个
return
语句,returning 新的 value。
也就是说,
- 请参阅Why is “while ( !feof (file) )” always wrong?
- 始终检查
scanf()
和家人的 return 值。
我正在为我的编程主题做练习,这是一个医院管理程序。在程序的开头,我需要将信息从 .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);
}
在C语言中,所有参数都是按值传递的。所以当修改head_m
时,你只是在修改一个局部变量。
如果您希望更改反映在调用函数中,请传递相关变量的地址,然后在函数中取消引用指针变量。
void dump_med(struct medico **head_m)
{
...
temp_m->next = *head_m;
*head_m = temp_m;
...
}
然后你这样称呼它:
dump_med(&head_m);
C 使用传递值进行函数参数传递。如果您要在函数内部修改 head_m
,它不会反映到实际参数中。您需要
- 将指针传递给要修改的指针。
- 有一个
return
语句,returning 新的 value。
也就是说,
- 请参阅Why is “while ( !feof (file) )” always wrong?
- 始终检查
scanf()
和家人的 return 值。