C程序Segmentation Fault(段错误)无法解决,求助排查
问题分析与修复方案
核心错误点
- 空指针导致非法内存访问:处理最后一个单词时,
findBlank返回NULL,原代码执行start = temp + 1会得到0x1,下一次循环访问*start触发段错误。 - 最后一个单词长度未统计:当
temp为NULL时,原代码的while(start < temp)条件不成立,无法统计最后一个单词的长度。 - 指针移动逻辑混乱:原代码中移动
start的条件错误,导致指针最终指向无效内存地址。
修复后的censor函数(不修改findBlank和fourStars)
void censor(char *start) { char *temp; while(*start != '\0') { int len = 0; temp = findBlank(start); // 区分中间单词与最后一个单词的长度统计逻辑 if (temp != NULL) { while(start < temp){ len++; start++; } } else { // 统计字符串末尾单词的长度 char *end = start; while(*end != '\0'){ len++; end++; } start = end; } // 替换4字母单词 if(len == 4) { char *replace; if (temp != NULL) { replace = temp - len; } else { replace = start - len; } fourStars(replace); } // 仅当存在下一个单词时,移动指针到下一个单词起始 if (temp != NULL) { start = temp + 1; // 跳过连续空格(增强健壮性) while(*start == ' ') { start++; } } else { // 最后一个单词处理完成,退出循环 break; } } }
修复说明
- 新增
temp是否为NULL的判断,分别处理中间单词和末尾单词的长度统计。 - 处理末尾单词时,直接统计到字符串结束的长度,并将
start移到末尾,避免后续非法访问。 - 修正指针移动逻辑:仅当存在下一个单词时,才将
start移到空格后的位置,末尾单词处理完成后直接退出循环。 - 针对末尾的4字母单词,正确计算替换起始位置为
start - len。
运行修复后的代码,原字符串"this is a test for the last word in line"会输出要求的结果:**** is a **** for the **** **** in ****
内容的提问来源于stack exchange,提问作者goldengomi
相关产品推荐
相关产品推荐

