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

自制C语言strdup函数是否合法?求专业技术判断

你的strdup实现存在严重问题,完全不符合标准strdup的语义

先明确:标准strdup函数的作用是为原字符串分配一块新的内存,把原字符串的内容完整复制到新内存中,最后返回指向新内存的指针。但你的实现完全没做到这一点,具体问题如下:

  • 没有分配新内存,本质是返回原字符串指针
    你的代码只是在移动原字符串的指针,最后通过计算回到原字符串的起始地址返回。调用这个函数后,返回的指针和传入的str指向同一块内存,根本没有生成任何副本。修改返回指针指向的内容会直接修改原字符串,完全违背strdup的设计意图。

  • 未初始化指针的风险
    dup_str变量一开始未初始化,虽然第一次循环里会被赋值为str,但如果传入的str是NULL,*str != '\0'这一步会直接触发未定义行为(程序崩溃),函数没有处理空指针输入的情况。

  • 长度变量类型不规范
    用int类型的len记录字符串长度存在隐患:int是有符号类型,且在部分系统下长度有限(比如32位int最大只能表示2^31-1长度的字符串),一旦遇到超长字符串会溢出。标准里应该用size_t(无符号的大小类型)来表示字符串长度。

  • 循环逻辑冗余且无意义
    循环里每次执行dup_str = str; dup_str++;完全是多余操作,因为下一次循环str会自增,这部分代码对最终结果没有任何贡献,只是在做无效的指针移动。

正确的strdup简化实现应该是这样的:

#include <stdlib.h>
#include <string.h>

char* strdup(const char* str) {
    if (str == NULL) {
        return NULL;
    }
    size_t len = strlen(str) + 1; // 要包含末尾的'\0'
    char* dup_str = malloc(len);
    if (dup_str != NULL) {
        memcpy(dup_str, str, len);
    }
    return dup_str;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:42:39