如何仅使用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
相关产品推荐
相关产品推荐

