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

如何解决C语言代码运行时指向stdio.h的Segmentation error

段错误原因分析与修复方案

核心错误点

  • printf格式符不匹配:printf("%s\n", p[i]); 里,%s 要求传入字符串指针(char*),但 p[i] 是单个字符(char 类型)。程序会把这个字符的ASCII值当作内存地址去访问,比如字符'a'对应97,程序会尝试读取0x61地址的内容,属于非法内存访问,直接触发段错误。
  • 数组初始化越界:char arr[4]={"abcd"}; 字符串 "abcd" 在C语言中会自动追加终止符 '\0',实际需要5字节存储空间,但你只声明了长度为4的数组,导致终止符无法存储,数组越界。
  • 循环变量未初始化:for(int i;i<4;i++) 中的i没有初始值,初始值是随机的,可能导致循环无法正常执行或执行次数异常。

修复后的代码

#include <stdio.h> 
int main()
{
    // 省略数组长度,让编译器自动分配足够空间容纳字符串和终止符
    char arr[] = "abcd";
    char *p = arr;

    // 初始化循环变量i为0
    for(int i = 0; i < 4; i++)
    {
        // 用%c格式符打印单个字符
        printf("%c\n", p[i]);
        // 若要从当前位置打印剩余字符串,可改为 printf("%s\n", p+i);
    }
    return 0;
}

补充说明

如果需求是逐个打印数组中的字符,用%c格式符;如果是从当前位置打印剩余字符串,再用%s并传入对应指针(比如p+i)。数组初始化时省略长度,能避免手动计算长度导致的越界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:47:32