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

C语言调用strcmp触发Segmentation Fault段错误问题及代码分析

分析并解决你的C代码中的Segmentation Fault问题

首先,你的代码触发Segmentation Fault(段错误)以及后续strcmp调用出错的核心原因,是结构体成员类型与输入格式符不匹配导致的内存越界,具体问题拆解如下:

错误根源

你定义的bank结构体中,an、name、type都是单个char类型:

typedef struct bank {
    char an;
    char name;
    char type;
    int bal;
};

但在scanf和printf中却使用了%s格式符——%s是用来读取/输出C风格字符串的,它会持续写入/读取字符直到遇到'\0'终止符。单个char的内存空间只有1字节,根本无法容纳完整的字符串(至少需要存储字符内容加终止符),这会直接导致内存越界写入,破坏程序的内存布局,触发Segmentation Fault。后续调用strcmp时,因为传入的不是合法的C字符串(没有正确的'\0',甚至指向无效内存),自然也会引发错误。

修正方案

把结构体中的单个char成员改为足够大小的字符数组,确保能容纳输入的字符串和终止符,同时在scanf中限制输入长度避免溢出:

#include <string.h>
#include<stdio.h>
#include<stdlib.h>

// 修改结构体成员为字符数组,根据实际需求调整数组大小
typedef struct bank {
    char an[20];    // 假设账号最多19个字符,留1字节存'\0'
    char name[50];  // 假设姓名最多49个字符
    char type[10];  // 假设账户类型最多9个字符
    int bal;
} Bank; // 给结构体起别名,方便后续使用

int main() {
    int i=0,n;
    printf("Enter the number of accounts\n");
    scanf("%d",&n);
    // 注:变长数组(VLA)在部分编译器环境有兼容性限制,也可以用malloc动态分配内存
    Bank a[n];
    printf("Enter the details of the users\n");
    for(i=0;i<n;i++) {
        // 用%19s这种格式限制输入长度,严格防止数组溢出
        scanf("%19s%49s%9s%d",a[i].an,a[i].name,a[i].type,&a[i].bal);
    }
    printf("The details of the users are\n");
    for(i=0;i<n;i++) {
        printf("%s\n%s\n%s\n%d\n\n",a[i].an,a[i].name,a[i].type,a[i].bal);
    }
    // 现在可以安全使用strcmp了,比如比较两个账号:
    // if(strcmp(a[0].an, a[1].an) == 0) { puts("两个账号相同"); }
    return 0;
}

额外注意事项

  • 字符数组的大小要根据实际输入的最大长度设定,必须留足存储'\0'的空间。
  • 使用scanf的长度限制(比如%19s)是预防输入溢出的关键,能大幅提升程序安全性。
  • 如果需要更灵活的内存管理,建议用malloc/free动态分配数组,替代变长数组(VLA),兼容性更好。

内容的提问来源于stack exchange,提问作者prajjval mehra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:34:34