在C编程中实现strdup()

时间:2016-05-10 08:02:24

标签: c

我正在C中实现strdup(),我是C的新手,我正在尝试构建自己的库。我正在使用来自strdup()的实际string.h来测试我的,当我针对主程序测试我的源时遇到了总线错误,但是当我使用实际的strdup()时没有。此外,我不能使用除malloc()之外的任何现有功能。

源代码:

#include <stdlib.h>

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

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

2 个答案:

答案 0 :(得分:9)

尝试以下修复:

  1. 在递增之前初始化len
  2. Don't cast malloc's return value,并且不使用sizeof(char),它在标准中定义为1,每个cstd 6.5.3.4p4:
      

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

  3. 使用指针保存原始str指针
  4. #include <stdlib.h>
    
    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;
    }
    

答案 1 :(得分:4)

如果你必须实现自己的strdup函数,至少要尽可能多地依赖string.h的其余部分。其中许多功能都经过优化,并且比您自己编写的功能更快。例如,strlen可能正在使用SSE指令,而手动搜索空终止符字节则不然。它的代码也更少,总是更好。简而言之,我建议这样做:

#include <stdlib.h>
#include <string.h>

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