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

自定义strdup函数无法正常运行,寻求C++字符指针内存复制解决办法

问题排查与修复:自定义strdup函数失效的原因

我一眼就发现了问题所在!你的自定义strdup函数里踩了一个经典的指针操作陷阱——第一个循环修改了传入的s指针的位置,导致后续复制时根本取不到原字符串的内容。

具体问题分析

来看你的原函数代码:

char* strdup(const char* s) { 
    int n = 0; 
    for(; *s != 0; s++) { n++; } // 这里s指针一直往后移,直到指向'\0'
    char* p = new char[n+1]; 
    for(int i = 0; i < n; i++) { p[i] = s[i]; } // 此时s已经在字符串末尾,s[i]是无效数据
    p[n] = 0; 
    return p; 
}

第一个for循环中,你直接对传入的s指针进行自增操作,循环结束后,s已经指向了原字符串的结束符'\0'的位置。这时候再执行p[i] = s[i],相当于从字符串末尾开始往后读取内存,得到的都是随机的垃圾数据,甚至会触发未定义行为。

修复后的代码

解决方法很简单:保存原始指针的副本,用副本去做长度计数,不要改动传入的s指针。同时别忘了添加内存释放的代码,避免内存泄漏:

#include <iostream>
using namespace std;

char* strdup(const char* s) {
    // 保存原始指针,避免修改传入的s
    const char* original_ptr = s;
    int n = 0;
    // 用副本遍历计算字符串长度
    while (*original_ptr != '\0') {
        n++;
        original_ptr++;
    }

    char* p = new char[n + 1];
    // 此时s仍指向原字符串开头,正常复制每个字符
    for (int i = 0; i < n; i++) {
        p[i] = s[i];
    }
    p[n] = '\0'; // 手动添加字符串结束符
    return p;
}

int main() {
    const char* p = "testing";
    char* p_copy = strdup(p);
    std::cout << p << '\n' << p_copy << std::endl;
    
    // 必须释放动态分配的内存,避免泄漏
    delete[] p_copy;
    return 0;
}

额外优化建议

你还可以把长度计数的循环写得更简洁:

int n = 0;
const char* temp = s;
// 先判断*temp是否为'\0',再自增,这样n会正确计数字符串长度
while (*temp++) {
    n++;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:59:16