C语言向自引用结构体组成的链表添加元素触发非法硬件指令如何解决
问题排查与修正方案
核心错误点
- 非法字符串拷贝导致内存越界:
strcpy(newEmp->gender, &gender)的用法完全错误。gender是单个char类型变量,内存仅存储1个字符,不存在字符串必须的终止符\0,strcpy会持续向后读取内存直到遇到\0,直接造成栈内存越界,触发未定义行为。 - 链表遍历逻辑致命错误:else分支中先给
temp指针malloc内存、紧接着赋值为employeeListHead,刚申请的内存直接泄漏。更严重的是遍历到链表最后一个节点后执行了free(temp),直接释放了链表尾节点,后续访问链表时触发野指针访问,是程序崩溃的直接诱因。temp仅为遍历用的临时指针,不需要申请内存,也绝对不能释放。 - 临时内存泄漏:你申请的
name、title临时字符串,在拷贝到结构体内置数组之后没有释放,造成内存泄漏。
修正后代码
结构体定义(无修改,补充宏定义参考)
#define MAX_NAME_LENGTH 101 #define MAX_JOB_LENGTH 101 typedef struct Employee{ char name[MAX_NAME_LENGTH]; char gender[2]; int age; char profession[MAX_JOB_LENGTH]; struct Employee *next; } Employee; Employee *employeeListHead = NULL; int nodeCount = 0;
修改后的addEmployee函数
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(" %c", &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); // 修正gender赋值逻辑,手动补充字符串终止符 newEmp->gender[0] = gender; newEmp->gender[1] = '\0'; newEmp->age = age; strcpy(newEmp->profession, title); newEmp->next = NULL; // 释放临时申请的字符串内存,避免泄漏 free(name); free(title); if(employeeListHead == NULL) { employeeListHead = newEmp; nodeCount++; } else { // 修正:temp仅为遍历指针,不需要额外申请内存 Employee *temp = employeeListHead; while(temp->next != NULL){ temp = temp->next; } temp->next = newEmp; nodeCount++; // 修正:不可释放temp,temp指向链表有效节点 } }
内容的提问来源于stack exchange,提问作者CCAas
相关产品推荐
相关产品推荐

