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
相关产品推荐
相关产品推荐

