自定义strpbrk函数出现段错误,求WSL+GCC环境下排查
问题排查与修复
你的代码存在两个核心问题,直接导致了段错误和逻辑错误:
1. 返回无效指针引发段错误
当需要返回“无匹配”的结果时,你写了return ('\0');——这是严重错误:
'\0'是字符常量,值为0,强制转换为char*类型后,会被当作地址0返回。这个地址属于内核空间的无效地址,任何对它的访问都会触发段错误。- 正确的写法是返回标准空指针
NULL,需要确保代码包含<stddef.h>(或者你的main.h中已经包含了该头文件)。
2. 匹配结果判断逻辑错误
你用position == 0来判断是否找到匹配,但这个条件无法区分两种情况:
- 情况1:
s的第一个字符就匹配了accept中的字符,此时position为0,但应该返回s本身; - 情况2:遍历完整个
s都没找到匹配,此时position也为0,应该返回NULL。 - 正确的判断依据应该是
check变量(代表是否找到匹配),而非position的值。
修复后的代码
#include "main.h" #include <stddef.h> // 引入NULL的定义 /** * _strpbrk - searches the string s for any of a set of bytes * * @s: String to be searched * @accept: Substring of bytes to search for * Return: Pointer to the first matching byte in s, or NULL if no match found */ char *_strpbrk(char *s, char *accept) { int i, j; int found = 0; int match_idx = 0; for (i = 0; s[i] != '\0'; i++) { for (j = 0; accept[j] != '\0'; j++) { if (s[i] == accept[j]) { found = 1; match_idx = i; goto end_search; // 直接跳出所有嵌套循环,提升效率 } } } end_search: return found ? (s + match_idx) : NULL; }
额外优化说明
- 用数组下标
s[i]代替*(s + i),代码可读性更强; - 找到匹配后用
goto直接跳出嵌套循环,比逐层break更简洁高效; - 标准
strpbrk对传入NULL指针的情况定义为未定义行为,所以如果要完全对齐标准,无需额外处理NULL参数。
内容的提问来源于stack exchange,提问作者curtarnolds
相关产品推荐
相关产品推荐

