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函数的返回值没有被使用,没必要设计为有返回值的函数。
修复逻辑参考
- 调整
ft_split的执行顺序:先判断s是否为NULL,再统计单词数 - 修正
sizeofeachstring的结束判断:除了下一个字符是分隔符的情况,下一个字符是\0且当前长度大于0时,也要把长度写入elem数组 - 修正
fillarrays的结束逻辑:无论是遇到分隔符还是字符串结束,都要给当前单词补\0 - 数组分配时多留一个位置放末尾的NULL指针
- 用完elem数组后及时释放
内容的提问来源于stack exchange,提问作者JFLobo
相关产品推荐
相关产品推荐

