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

小型测试C代码运行触发Segmentation fault问题排查求助

问题分析与解决方案

嘿,我来帮你拆解下这段代码触发Segmentation fault的原因,以及对应的修复方式:

核心错误:printf格式符与参数类型不匹配

你代码里的这一行是直接触发段错误的元凶:

printf("%s", array1[i+1]);
  • %s是C语言中用于打印字符串的格式说明符,它要求传入的参数是一个指向字符串首地址的指针(char*类型)。
  • 但你这里传入的array1[i+1]是单个字符的值(也就是字符'b',对应的ASCII码是98)。程序会把这个数值当作内存地址去访问,而这个地址几乎肯定是不属于你的程序可访问范围的,因此直接触发了段错误。

次要潜在问题:字符串缺少结束符

你的array1是长度为3的char数组,你依次存入了'a'、'b'、'c',但C语言的标准字符串必须以'\0'(空字符)作为结尾标记。哪怕你解决了第一个问题,之后如果尝试用%s打印整个数组,也会因为找不到结束符而越界读取内存,同样可能引发崩溃或乱码。

修复后的代码示例

根据你的需求,这里提供两种修复方向:

方向1:打印单个字符

如果你只是想输出array1[i+1]对应的单个字符,把格式符改成%c即可:

#include <stdio.h>

void main(){ 
    int i = 0; 
    char array1[3]; 
    array1[0] = 'a'; 
    array1[1] = 'b'; 
    array1[2] = 'c'; 

    printf("%c", array1[i+1]); // 用%c打印单个字符
    printf("%d", i); 
}

方向2:打印从指定位置开始的字符串

如果你本来想打印从array1[i+1]开始的子字符串,需要传入该位置的地址,同时给数组添加结束符:

#include <stdio.h>

void main(){ 
    int i = 0; 
    char array1[4]; // 多预留一个位置存放结束符
    array1[0] = 'a'; 
    array1[1] = 'b'; 
    array1[2] = 'c'; 
    array1[3] = '\0'; // 添加字符串结束标记

    printf("%s", &array1[i+1]); // 传入子字符串的首地址
    printf("%d", i); 
}

内容的提问来源于stack exchange,提问作者z.rubi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:52:06