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:
len
antes de incrementarlo. 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.
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; }