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

自制C-string函数时strcpy的指针与内存问题求助

问题根源与解决方法

核心问题分析

  1. 指针未保存初始地址:你大概率在实现mystrcpy时,直接用传入的目标指针(比如pc)去遍历复制字符,最后返回的是已经移动过的指针,自然和原pc不相等。标准strcpy要求返回传入的目标指针原值,不是遍历后的指针。
  2. 错误使用动态内存分配:strcpy的设计逻辑是调用者负责提供足够空间的目标内存,函数本身不分配内存。你在函数内动态分配内存返回,不仅会导致返回指针和传入的pc(栈数组地址)完全不同,还会因为调用者无法释放这块堆内存造成泄漏。

正确的mystrcpy实现

char* mystrcpy(char* dest, const char* src) {
    // 先保存目标指针的初始地址,这是最后要返回的
    char* original_dest = dest;
    
    // 逐字符复制,包括终止符'\0'
    while (*src != '\0') {
        *dest = *src;
        dest++;
        src++;
    }
    // 别忘了复制字符串结束符
    *dest = '\0';
    
    // 返回最初的目标指针
    return original_dest;
}

或者更简洁的等价写法:

char* mystrcpy(char* dest, const char* src) {
    char* temp = dest;
    while ((*temp++ = *src++) != '\0');
    return dest;
}

测试验证要点

你的测试代码里的ASSURE(pcResult == pc)断言,本质是验证返回值是否为原目标指针。用上面的实现,返回的是传入的dest原值(也就是测试中的pc),断言必然通过,同时目标数组的内容也会被正确复制。

关键注意事项

  • 调用mystrcpy前,必须确保目标数组dest有足够的空间容纳源字符串(包括终止符),否则会触发缓冲区溢出。
  • 绝对不要在mystrcpy内部做动态内存分配,这完全不符合C标准库中strcpy的语义,会带来内存管理混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:22:33