在C编程中实现strdup()
我正在C中实现strdup()
,我是C的新手,我正在尝试构建自己的库。 我正在使用string.h
的实际strdup()
来测试我的,当我对主程序测试我的源时遇到总线错误但是当我使用实际的strdup()
。 另外我不能使用除malloc()
之外的任何现有函数。
源代码:
#include char *ft_strdup(char *src) { char *str; int len; while (src[len]) len++; str = (char*)malloc(sizeof(*str) * (len+1)); while (*src) *str++ = *src++; *str = '\0'; return (str); }
为什么我一直收到总线错误?
尝试以下修复:
- 在增加
len
之前初始化len
。 - 不要强制转换
malloc
的返回值 ,也不要使用sizeof(char)
,它在标准中定义为1,每个cstd 6.5.3.4p4:
当sizeof应用于具有char,unsigned char或signed char(或其限定版本)类型的操作数时,结果为1。
- 使用指针保存原始
str
指针
#include char *ft_strdup(char *src) { char *str; char *p; int len = 0; while (src[len]) len++; str = malloc(len + 1); p = str; while (*src) *p++ = *src++; *p = '\0'; return str; }
如果你必须实现自己的strdup
函数,至少要尽可能多地依赖string.h的其余部分。 其中许多function都经过优化,并且比您自己编写的function更快。 例如, strlen
可能正在使用SSE指令,而您手动搜索空终止符字节则不然。 这也是更少的代码,总是更好。 总之,我建议这样做:
#include #include char *ft_strdup(const char *s1) { char *str; size_t size = strlen(s1) + 1; str = malloc(size); if (str) { memcpy(str, s1, size); } return str; }