我是新来的,我需要一些帮助。我想学习如何将NULL
列表传递给函数填充它然后将其返回到我的main函数。
FOR INSTANCE:
#include <cstdio>
typedef struct empNode {
char amka[12];
char first_name[30];
char last_name[30];
int year; //etos proslhpshs
float salary;
int num_of_children;
Child *children;
struct empNode *next;
} empNode;
void load_employees_from_file(empNode **employees);
//===========================================================
int main(void) {
empNode *employees = NULL;
load_employees_from_file(&employees);
while (employees != NULL) {
printf("%s ", employees->amka);
employees = employees->next;
}
}
//===========================================================
void load_employees_from_file(empNode **employees) {
FILE * fp;
int num_of_employees;
int i;
fp = fopen("employees.txt", "r");
if (fp == NULL) {
printf("Something went wrong, try again.\n");
return;
}
// here we read the first line of file to see how employee we have
fscanf(fp, "%d ", &num_of_employees);
while (num_of_employees) {
*employees = (empNode*) malloc(sizeof (empNode));
fscanf(fp, "%s ", (*employees)->amka);
fscanf(fp, "%s ", (*employees)->first_name);
fscanf(fp, "%s ", (*employees)->last_name);
fscanf(fp, "%d ", &(*employees)->year);
fscanf(fp, "%f ", &(*employees)->salary);
fscanf(fp, "%d\n", &(*employees)->num_of_children);
if ((*employees)->num_of_children > 0) {
(*employees)->children = (Child*) malloc(((*employees)->num_of_children) * sizeof (Child));
for (i = 0; i < (*employees)->num_of_children; i++) {
fscanf(fp, "%s ", (*employees)->children[i].fname);
strcpy((*employees)->children[i].lname, (*employees)->last_name);
fscanf(fp, "%d\n", &(*employees)->children[i].year_of_birth);
}
}
(*employees)->next = (empNode*) malloc(sizeof (empNode));
*employees = (*employees)->next;
num_of_employees--;
}
fclose(fp);
}
我在while
函数中运行main
时遇到错误,更具体地说,我的程序崩溃了。
-------------------------------------------- ----------------------- 好吧让mu把它说得更清楚,经过更正我没有问题我的功能列表中的问题是我的列表无法转移到我的主要功能。 这是一个明显的例子:
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node;
void read_int(node **nn);
int main(void)
{
node *nn=NULL;
read_int(&nn);
printf("%d", nn->data);
return 0;
}
void read_int(node **nn)
{
FILE *fp;
fp=fopen("test.txt", "r");
fscanf(fp, "%d", (*nn)->data);
fclose(fp);
}
这是完全相同的问题,更容易下载, test.txt 文件只包含数字2.但我不能在我的主文件中打印。
答案 0 :(得分:2)
浏览代码,似乎有几个问题。您应该学会使用调试器,它可以让您在执行期间逐行执行代码并观察实际行为。
以下是我认为你应该看到的一些明显问题:
*employees
循环退出时,您认为while
的价值是什么?具体来说,请考虑以下声明:*employees = (*employees)->next;
while (employees != NULL)
将没有意义)。在这种情况下,您在哪里设置NULL
终止符值?您似乎无法将next
字段设置为NULL
... malloc
两次?您似乎正在分配两个不同的内存块来代表同一个员工。我认为上面的#1是你的程序现在崩溃的原因。 (但是如果你解决了这个问题,你的程序可能会因其他问题之一而崩溃。)
现在,在循环的最后一次迭代中,你会这样做:
(*employees)->next = (empNode*) malloc(sizeof (empNode));
*employees = (*employees)->next;
这意味着*employees
(指向employees
的{{1}})将始终指向未初始化的main
结构。由于内存未初始化,empNode
指针将是垃圾。这肯定会引起一些问题。
答案 1 :(得分:2)
在您的函数void load_employees_from_file(empNode **employees)
更改:
(*employees)->next = (empNode*) malloc(sizeof (empNode));
到
(*employees)->next = NULL;
紧接着*employees
变为next
并且while
循环从动态分配内存的开头开始:
*employees = (empNode*) malloc(sizeof (empNode));
然后填充。
否则,如果这是最后一名员工,则next
元素仍为NULL
指针。
这样,当main
元素(指向while
}时,true
next
循环终止条件为NULL
) 到达了。