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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:25:19