You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:33:18