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

自定义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,这里存在两个问题:

  1. c在test2中是0600(八进制,十进制384),这是一个int类型的值。当char是有符号类型时(大多数系统默认如此),*sptr是'\200'(八进制200,十进制128,作为有符号char是-128),和int型的384比较时,-128会被扩展为int的-128,显然不等于384,所以代码找不到匹配的字符。
  2. 标准要求用无符号字节比较,避免符号扩展带来的错误,尤其是处理超出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:27:39