C语言searchName函数查询成功后抛出内存访问异常,如何修复?
问题分析与修复
你的代码存在几个关键问题,导致程序崩溃和功能异常:
1. 函数返回值不匹配
searchName声明返回char*类型,但函数内部找到匹配时直接写return;(无返回值),未找到时也没有返回任何值。main里调用printf("%s", searchName(headPtr))会尝试读取这个不存在的返回值,直接触发访问违规错误,这是崩溃的核心原因。
2. 输入缓冲区残留换行符
scanf("%s", test.name)读取完输入后,输入缓冲区里的换行符会被留在里面,后续fgets会直接读取这个空行,导致你之前遇到输入跳过的问题。
3. 链表未初始化,查询逻辑无效
你创建了test节点,但没有把它加入到headPtr指向的链表中,headPtr始终是NULL,searchName里的循环根本不会执行,理论上不可能找到匹配项(你的测试输出可能是代码未完全同步导致的)。
4. fgets读入的字符串包含换行符
fgets会把输入末尾的换行符也读入字符串,和scanf读取的不含换行的test.name比较时,strcmp会返回非0,导致匹配失败。
修复后的代码
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node { char name[30]; struct node* NEXT; }nodeT; // 改为void类型,函数内部已处理打印,无需返回值 void searchName(nodeT* top); int main() { nodeT* headPtr = NULL; nodeT* test = (nodeT*)malloc(sizeof(nodeT)); if(test == NULL) { printf("内存分配失败\n"); return 1; } printf("Name: "); scanf("%s", test->name); // 将test节点加入链表 test->NEXT = headPtr; headPtr = test; // 清理scanf残留的换行符 while(getchar() != '\n'); searchName(headPtr); // 释放节点内存 free(test); return 0; } void searchName(nodeT* top) { nodeT* temp = top; char searchName[30]; int found = 0; printf("Search name: "); fgets(searchName, sizeof(searchName), stdin); // 去掉fgets读入的换行符 searchName[strcspn(searchName, "\n")] = '\0'; while (temp != NULL) { if (strcmp(searchName, temp->name) == 0) { printf("Name: %s\n", temp->name); found = 1; return; // void函数可直接return结束 } temp = temp->NEXT; } if (!found) { printf("Your search was not found\n"); } }
关键修复点说明
- 将
searchName改为void类型,避免返回值不匹配问题,同时去掉main中多余的printf("%s", ...)调用。 - 用
while(getchar() != '\n');清理scanf残留的换行符,确保fgets能正确读取用户输入。 - 将
test节点加入链表,让查询逻辑能正常遍历节点。 - 用
strcspn去掉fgets读入的换行符,保证字符串比较的正确性。 - 修正
main函数为标准的int main并返回0,符合C语言标准。
内容的提问来源于stack exchange,提问作者yllwtoast
相关产品推荐
相关产品推荐

