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

如何仅使用malloc()和free()实现符合要求的strdup函数?

实现自定义的strdup函数

没问题,我来帮你实现一个符合要求的strdup函数——完全不依赖标准库字符串函数,只使用malloc()分配内存,失败时返回NULL,并且只分配刚好足够的存储空间。

实现思路

要完成这个函数,我们需要分三步走:

  • 计算原字符串的长度:因为要分配最小空间,得先知道原字符串(包括终止符'\0')需要多少字节。
  • 分配内存:用malloc()申请对应大小的内存,申请失败直接返回NULL。
  • 复制字符串:把原字符串的每个字符(包括终止符)逐个复制到新分配的内存中。

完整代码实现

#include <stdlib.h> // 仅引入malloc的声明

char *strdup(const char *s) {
    // 处理传入NULL的情况(可选,但让函数更健壮)
    if (s == NULL) {
        return NULL;
    }

    // 第一步:计算字符串长度(不包含终止符)
    size_t len = 0;
    while (s[len] != '\0') {
        len++;
    }

    // 第二步:分配内存,需要额外1字节存终止符'\0'
    char *duplicate = malloc(len + 1);
    if (duplicate == NULL) {
        return NULL; // 内存分配失败,返回NULL
    }

    // 第三步:复制所有字符(包括终止符)
    size_t i = 0;
    while (i <= len) { // 循环到i=len时,复制'\0'
        duplicate[i] = s[i];
        i++;
    }

    return duplicate;
}

关键细节说明

  • const修饰参数:用const char *s表示我们不会修改原字符串,符合函数的只读语义。
  • 最小存储空间:我们先精确计算原字符串的字符数,再加上1字节的终止符,确保分配的内存刚好够用,不会浪费。
  • 错误处理:无论是传入NULL还是malloc()失败,都返回NULL,符合标准strdup的错误行为。
  • 用户责任:正如你提到的,函数返回的动态分配内存地址,必须由调用者负责用free()释放,否则会造成内存泄漏。

测试场景参考

  • 传入空字符串"":函数会分配1字节内存,复制'\0'后返回。
  • 传入正常字符串如"hello":分配6字节内存,复制所有字符和终止符。
  • 内存不足时:malloc()返回NULL,函数直接返回NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:48:03