自定义ft_memccpy函数遇0600参数失效问题求助
问题分析与解决
首先,你的ft_memccpy实现存在两个关键错误,这直接导致了test2的失败,而test1碰巧"正常"运行只是巧合。让我们逐一拆解:
错误1:错误的循环终止条件
你的循环条件是:
while (n && *dptr && *sptr)
这完全不符合标准memccpy的行为:
memccpy的逻辑是最多复制n个字节,直到遇到指定的字符c,不管dest或src中的字节是否为0(或其他值)。- 你加入的
*dptr && *sptr会导致循环提前终止:如果dest或src中出现0字节,循环就会停止,这显然不对。比如如果src里有0,或者dest初始值有0,复制就会中断。
错误2:字符比较的类型不匹配
标准memccpy明确规定:
第三个参数
c会被转换为unsigned char,然后将src中的每个字节也转换为unsigned char进行比较。
而你的代码直接用*sptr == c,这里存在两个问题:
c在test2中是0600(八进制,十进制384),这是一个int类型的值。当char是有符号类型时(大多数系统默认如此),*sptr是'\200'(八进制200,十进制128,作为有符号char是-128),和int型的384比较时,-128会被扩展为int的-128,显然不等于384,所以代码找不到匹配的字符。- 标准要求用无符号字节比较,避免符号扩展带来的错误,尤其是处理超出ASCII范围的字符时。
修正后的ft_memccpy实现
void *ft_memccpy(void *dest, const void *src, int c, size_t n) { // 使用unsigned char指针确保按字节无符号处理 unsigned char *dptr = (unsigned char *)dest; const unsigned char *sptr = (const unsigned char *)src; // 将c转换为unsigned char,符合标准要求 unsigned char uc = (unsigned char)c; // 循环条件仅检查剩余字节数n while (n-- > 0) { *dptr = *sptr; // 用无符号字节比较 if (*sptr == uc) { // 返回下一个字节的指针,符合标准 return (void *)(dptr + 1); } dptr++; sptr++; } // 未找到c或n用完,返回NULL return NULL; }
为什么test1看似正常?
test1中你传入的是'\200',它作为char类型,在有符号char系统中是-128,而c被转换为int后也是-128,此时*sptr == c的比较刚好成立,所以循环能正确终止。但这只是巧合,你的实现本质上是不符合标准的。
关于0600的说明
你提到0600和chmod无关是对的,这里它只是一个八进制整数,对应十进制384。由于memccpy只关心c的低8位(因为转换为unsigned char),所以0600的低8位是0200(八进制),也就是十进制128,和'\200'的实际字节值是一样的。标准memccpy会正确识别这一点,但你的原实现因为类型比较错误,无法匹配。
内容的提问来源于stack exchange,提问作者kirrikirri
相关产品推荐
相关产品推荐

