如何解决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
相关产品推荐
相关产品推荐

