自制C-string函数时strcpy的指针与内存问题求助
问题根源与解决方法
核心问题分析
- 指针未保存初始地址:你大概率在实现
mystrcpy时,直接用传入的目标指针(比如pc)去遍历复制字符,最后返回的是已经移动过的指针,自然和原pc不相等。标准strcpy要求返回传入的目标指针原值,不是遍历后的指针。 - 错误使用动态内存分配:
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
相关产品推荐
相关产品推荐

