自制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
相关产品推荐
相关产品推荐

