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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:24:03