小型测试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
相关产品推荐
相关产品推荐

