VS Code调试C程序出现Segmentation Fault段错误如何解决
问题原因及修复方案
核心段错误触发原因
你定义的char* str是未初始化的野指针,没有申请对应的内存空间存储输入的字符串,调用scanf("%s", str)时输入的内容会写入随机内存地址,触发内存访问越界。Linux环境下未报错仅为侥幸,野指针的行为属于C标准规定的未定义行为,不报错不代表代码逻辑正确。
代码存在的其他问题
fflush(stdin)属于未定义操作,C标准仅规定fflush对输出流生效,用它清空输入缓冲区的效果完全依赖编译器实现,无法跨平台通用conio.h是Windows平台特有的头文件,Linux原生不支持,保留该头文件在Linux环境下无法通过编译void main()不符合C标准规范,标准main函数的返回值类型为int,执行结束需要返回0表示正常退出
修正后代码
#include <stdio.h> #include <stdlib.h> int main() { int a; float x; char ch; // 给字符串分配100字节的内存空间,最多存储99个字符+结束符 char* str = (char*)malloc(100 * sizeof(char)); if(str == NULL) { printf("内存申请失败\n"); return 1; } printf("Enter integer number: "); scanf("%d", &a); printf("\nEnter real number : "); scanf("%f", &x); printf("\nEnter a character: "); // 格式符前加空格,自动跳过输入缓冲区残留的换行/空白字符 scanf(" %c", &ch); printf("\nEnter a string: "); // 限制最多输入99个字符,避免缓冲区溢出 scanf("%99s", str); printf("\nData:"); printf("\n Integer: %d", a); printf("\n Real: %.2f", x); printf("\n Character: %c", ch); printf("\n String: %s\n", str); // 释放申请的内存,避免内存泄漏 free(str); str = NULL; return 0; }
如果不想用动态内存分配,也可以直接定义字符数组char str[100];,使用方法和上面一致,不需要手动malloc和free。
内容的提问来源于stack exchange,提问作者Quang Khôi Phạm
相关产品推荐
相关产品推荐

