添加到 C 中的自引用结构列表?
Posted
技术标签:
【中文标题】添加到 C 中的自引用结构列表?【英文标题】:Adding to a list of Self Referential Structures in C? 【发布时间】:2022-01-07 13:31:13 【问题描述】:我在尝试创建结构的自引用列表时遇到了许多问题。我目前正在收到一条非法的硬件指令,我所知道的是,它是在我的打印语句之后的打印语句之后的东西。谁能帮助指出我需要做些什么才能使我的实施正确?谢谢。
我的添加功能
Employee *employeeListHead = NULL;;
int nodeCount = 0;
void addEmployee(void)
char *name = (char*) malloc(MAX_NAME_LENGTH*sizeof(char));
char gender;
int age;
char *title = (char*) malloc(MAX_JOB_LENGTH*sizeof(char));;
printf("Enter name: \n");
scanf(" %100s", name);
scanf("%*[^\n]%*c");
printf("Enter gender: \n");
scanf(" %1c", &gender);
scanf("%*[^\n]%*c");
printf("Enter age: \n");
scanf(" %d", &age);
scanf("%*[^\n]%*c");
printf("Enter job title: \n");
scanf(" %100s", title);
scanf("%*[^\n]%*c");
printf("The employee you've entered is: %s %c %d %s \n", name, gender, age, title);
Employee *newEmp = (Employee*)malloc(sizeof(Employee));
strcpy(newEmp->name, name);
strcpy(newEmp->gender, &gender);
newEmp->age = age;
strcpy(newEmp->profession, title);
newEmp->next = NULL;
if(employeeListHead == NULL)
employeeListHead = newEmp;
nodeCount++;
else
Employee *temp = (Employee*)malloc(sizeof(Employee));
temp = employeeListHead;
while(temp->next != NULL)
temp = temp->next;
temp->next = newEmp;
nodeCount++;
free(temp);
结构
typedef struct Employee
char name[MAX_NAME_LENGTH];
char gender[2];
int age;
char profession[MAX_JOB_LENGTH];
struct Employee *next;
Employee;
【问题讨论】:
您能在 Employee 结构中添加吗? 欢迎来到 Stack Overflow。请使用tour 并阅读How to Ask。具体来说。寻求调试帮助的问题必须提供完整的minimal reproducible example。也就是说,任何人都可以完全按照所示重现问题的最少完整代码量。strcpy(newEmp->gender, &gender);
是错误的,因为gender
是单个字符而不是字符串。执行newEmp->gender = gender
,假设gender
字段是char
(您没有显示)。
好的,既然您已经添加了struct
定义,我们可以说正确的代码是newEmp->gender[0] = gender; newEmp->gender[1] = '\0';
或者将gender
作为字符串而不是单个字符读取,然后您可以使用strcpy
。或者更好的是,直接读入 newEmp
字段 - 没有意义读入 tmp 变量然后复制。
Employee *temp = (Employee*)malloc(sizeof(Employee)); temp = employeeListHead;
是内存泄漏。然后你 free(temp);
但这是列表中的倒数第二个节点,因为循环。只需执行Employee *temp = employeeListHead;
并消除malloc
和free
。
【参考方案1】:
char *name = (char*) malloc(MAX_NAME_LENGTH*sizeof(char));
你不需要这个(这是内存泄漏)。请改用char name[MAX_NAME_LENGTH];
。
char *title = (char*) malloc(MAX_JOB_LENGTH*sizeof(char));;
你不需要这个(这是内存泄漏)。请改用char title[MAX_JOB_LENGTH];
;
strcpy(newEmp->gender, &gender);
这是错误的。 gender
不是字符串(除非它是零长度字符串,这没有多大意义)。你不能strcpy
不是字符串的东西。 OTOH newEmp->gender
是一个字符串。要么制作这两个字符串,然后使用strcpy
,要么制作两个单个字符,然后使用简单的赋值。
Employee *temp = (Employee*)malloc(sizeof(Employee));
temp = employeeListHead;
请不要这样做。你可能不会做这样的事情
double x = 2.0 + 76*n + cos(y*2*pi*length);
x = 42;
原因很明显:第一行的计算只是被第二行的赋值遗忘并丢弃了。你一开始就不可能写第一行,因为它没有做任何有用的事情。除非x
是一个指针并且第一行调用malloc
,否则它不仅没有做任何有用的事情,而且还会做一些有害的事情:它会泄漏内存。
Employee *temp = employeeListHead;
你只需要,当然最后没有free
。
【讨论】:
以上是关于添加到 C 中的自引用结构列表?的主要内容,如果未能解决你的问题,请参考以下文章