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

为什么C语言比较字符数组时会出现segmentation fault(段错误)

问题原因分析

核心触发段错误的原因是空指针访问,具体问题出在两处逻辑:

  • while循环逻辑顺序错误:循环条件判断token != NULL后进入循环,第一行代码就调用strtok(NULL, " ")获取下一个token,strtok遍历完所有分割结果后会返回NULL,后续直接将空指针传入strncmp做字符串比较,触发非法内存访问。
  • 存在隐性隐患:如果输入的sentence是空字符串,第一次调用strtok就会返回NULL,第98行的strncmp也会直接触发空指针访问。
修复方案

调整循环执行顺序,每次拿到token先判空,再执行比较逻辑,最后再取下一个token即可,修复后代码如下:

int word_freq(char *sentence, char *word){
    int n = 0;
    int word_len = strlen(word);
    char *token;
    printf("chosen word: %s\nword length: %d\n", word, word_len);
    token = strtok(sentence, " "); // 获取第一个token

    while (token != NULL) {
        printf("%s", "x");
        // 非空才执行比较,补充token长度判断避免前缀匹配误判
        if (strlen(token) == word_len && strncmp(token, word, word_len) == 0) {
            n++;
        }
        token = strtok(NULL, " "); // 比较完再取下一个token
    }

    printf("\n");
    return n;
}

补充说明:原逻辑只比较word长度的字符会出现前缀匹配误判,比如word是app、token是apple也会被计数,修复代码中增加了token长度判断可以实现完整单词匹配。

内容的提问来源于stack exchange,提问作者h4ppyturt1e

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 04:06:01