GCC 12.2.0下代码出现Segmentation Fault 11,已定位位置却不明原因
问题分析与修复
核心错误原因
你的段错误(Segmentation Fault 11)来源于while循环逻辑错误导致指针越界访问非法内存:
while(*end != 0 || strncmp(start,end,1) != 0){ end++; }
当end指针走到字符串末尾(指向'\0')时,*end != 0条件为假,但此时strncmp(start, end, 1)会比较*start和'\0',结果必然不等于0,导致整个循环条件为真,end会继续往后移动,访问超出字符串分配的内存区域,触发段错误。
另外还有两个次要问题:
main函数中使用的res变量未定义,编译时会报错charset数组和overTwo变量未被使用,属于冗余代码
修复方案
先修正循环条件避免越界,同时补全代码中的其他问题:
void slidingWindow(char *start, char *end){ // 后续可补充滑动窗口的实际逻辑,比如维护窗口内的字符集 // 先修复循环避免越界 while(*end != 0 && strncmp(start, end, 1) != 0){ end++; } } int lengthOfLongestSubstringTwoDistinct(char *s){ char *start = s, *end = s; slidingWindow(start, end); return 0; } int main(){ size_t size = 100001; char *s = malloc(sizeof(char[size])); if (!s) { // 增加内存分配失败的判断 perror("malloc failed"); return 1; } getline(&s, &size, stdin); int res = lengthOfLongestSubstringTwoDistinct(s); // 定义res变量 printf("%d\n", res); free(s); // 释放malloc的内存,避免泄漏 return 0; }
额外说明
如果你的目标是实现“最多包含两个不同字符的最长子串”,当前slidingWindow函数的逻辑还不完善,需要补充字符集维护逻辑(比如记录窗口内的字符种类,超过限制时移动start指针),但修复循环越界后可先解决段错误问题。
内容的提问来源于stack exchange,提问作者New Leaf
相关产品推荐
相关产品推荐

