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

C语言实现ft_split字符串分割函数偶发段错误问题求助

代码存在的问题及修复方案

核心问题(直接导致段错误)

  • NULL指针检查位置错误:ft_split 函数中先执行了counter(s, c)和sizeofeachstring(s, c),再判断s == NULL,如果传入的s是空指针,两个子函数会直接访问s[i]触发非法内存访问。需要把s == NULL的判断移到ft_split函数最开头。
  • 字符串数组未预留末尾NULL指针的位置:题目要求返回的数组末尾必须以NULL结束,你当前分配的数组大小是sizeof(char *) * size(size是单词总数),少分配了1个指针位,应该改为malloc(sizeof(char *) * (size + 1)),分配完成后手动设置new[size] = NULL。如果没有这个NULL,调用方遍历数组时会访问到未初始化的非法指针,触发段错误。
  • 单词长度统计逻辑遗漏末尾单词:sizeofeachstring函数仅在当前字符不是分隔符、下一个字符是分隔符时才存储单词长度,如果字符串的最后一个字符不是分隔符(绝大多数场景都是这个情况),最后一个单词的长度不会被写入elem数组,elem数组最后一位是未初始化的垃圾值,后续给该单词分配内存时大小错误,要么内存不够写入时越界,要么分配异常大小的内存。
  • 最后一个单词未补字符串结束符:fillarrays函数仅在遇到分隔符时才给当前单词补\0,如果单词后面直接是字符串结束符\0,不会触发补结束符的逻辑,单词会变成非法的非C标准字符串,后续读取时会越界访问。

次要问题(内存泄漏/鲁棒性不足)

  • elem数组是动态分配的内存,使用完成后没有调用free释放,造成内存泄漏。
  • 循环分配每个子字符串内存时,没有判断malloc是否失败,如果某一次分配失败,没有释放之前已经分配的内存,也没有返回NULL,会出现野指针和内存泄漏。
  • fillarrays函数的返回值没有被使用,没必要设计为有返回值的函数。

修复逻辑参考

  1. 调整ft_split的执行顺序:先判断s是否为NULL,再统计单词数
  2. 修正sizeofeachstring的结束判断:除了下一个字符是分隔符的情况,下一个字符是\0且当前长度大于0时,也要把长度写入elem数组
  3. 修正fillarrays的结束逻辑:无论是遇到分隔符还是字符串结束,都要给当前单词补\0
  4. 数组分配时多留一个位置放末尾的NULL指针
  5. 用完elem数组后及时释放

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:06:00