Implementación de strdup () en progtwigción en C

Estoy trabajando en la implementación de strdup() en C, soy nuevo en C y estoy tratando de construir mi propia biblioteca. Estoy usando el strdup() real de string.h para probar el mío y me encuentro con un error de bus cuando strdup() mi fuente con un progtwig principal, pero ninguno cuando uso el strdup() real. Tampoco puedo usar ninguna función existente excluyendo malloc() .

Código fuente:

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

¿Por qué sigo recibiendo un error de autobús?

Intente la siguiente corrección:

  1. Inicializa len antes de incrementarlo.
  2. No emita el valor de retorno de malloc , y no use sizeof(char) , se define como 1 en el estándar, por cstd 6.5.3.4p4:

    Cuando se aplica sizeof a un operando que tiene el tipo char, unsigned char, o signed char, (o una versión calificada del mismo), el resultado es 1.

  3. Use un puntero para guardar el puntero str original

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

Si debe implementar su propia función strdup , al menos confíe en el rest de string.h tanto como pueda. Muchas de estas funciones están optimizadas y son más rápidas de lo que puede escribirlas usted mismo. Por ejemplo, strlen probablemente está usando instrucciones SSE, mientras que su búsqueda manual para el byte de terminación nula no lo está. También es menos código, que siempre es mejor. En resumen, sugeriría esto:

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