在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); } 

为什么我一直收到总线错误?

尝试以下修复:

  1. 在增加len之前初始化len
  2. 不要强制转换malloc的返回值 ,也不要使用sizeof(char) ,它在标准中定义为1,每个cstd 6.5.3.4p4:

    当sizeof应用于具有char,unsigned char或signed char(或其限定版本)类型的操作数时,结果为1。

  3. 使用指针保存原始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; }