strcpy vs strdup

4 minutos de lectura

yo lei eso strcpy es para copiar una cadena, y strdup devuelve un puntero a una nueva cadena para duplicar la cadena.

¿Podría explicar qué casos prefiere usar? strcpy y que casos prefieres usar strdup?

avatar de usuario
Abdul Muheedh

strcpy(ptr2, ptr1) es equivalente a while(*ptr2++ = *ptr1++)

donde como strdup es equivalente a

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

(la versión memcpy podría ser más eficiente)

Entonces, si desea que la cadena que ha copiado se use en otra función (como se crea en la sección del montón), puede usar strdup, de lo contrario, strcpy es suficiente.

  • Buena respuesta aparte de la última oración, que es confusa. Supongo que te refieres a la vida del strdup()ed string puede extenderse más allá del final de la función actual, pero ese podría ser el caso de todos modos (si el objetivo de strcpy() es un búfer proporcionado por la persona que llama, una variable global o se asigna manualmente usando malloc() o new).

    – j_random_hacker

    24 de diciembre de 2012 a las 12:05

  • Sí, es cierto que si el búfer proporcionado por la persona que llama es una variable global o un puntero dinámico en sí mismo, entonces no es necesario usar strdup. Acabo de señalar uno de los escenarios de casos de uso y gracias por completarlo.

    – Abdul Muheedh

    24 de diciembre de 2012 a las 12:42


  • Realmente amo el while(*ptr2++ = *ptr1++)! 🙂

    – Aloys

    11 de junio de 2013 a las 21:56


  • En el bucle while, ¿cómo funciona la condición de salida?

    – sbhatla

    5 de diciembre de 2016 a las 0:33

  • @sbhatla En C, las cadenas terminan con un nulbyte, que se evalúa como falso, y una expresión de asignación se evalúa como el valor asignado.

    usuario1115652

    7 febrero 2017 a las 16:49


Las funciones strcpy y strncpy forman parte de la biblioteca estándar de C y funcionan en la memoria existente. Es decir, usted debe proporcionar la memoria en la que las funciones copian los datos de la cadena y, como corolario, usted debe tener sus propios medios para averiguar cuánta memoria necesita.

Por el contrario, strdup es una función Posix y realiza la asignación de memoria dinámica por usted. Devuelve un puntero a la memoria recién asignada en la que ha copiado la cadena. Pero usted ahora son responsables de esta memoria y deben eventualmente free eso.

Lo que hace strdup uno de los “escondidos malloc” funciones de conveniencia, y presumiblemente también es por eso que no es parte de la biblioteca estándar. Siempre que use la biblioteca estándar, sabe que debe llamar a uno free para cada malloc/calloc. Pero funciones como strdup introducir un oculto mallocy debes tratarlo igual que un malloc con el fin de gestionar la memoria. (Otra función de asignación oculta de este tipo es GCC abi::__cxa_demangle().) ¡Tener cuidado!

  • Ahh, siempre me pregunté por qué esto no estaba en stdlib, y ahora lo sé.

    – Maury Markowitz

    11 de marzo de 2018 a las 17:51

strdup asigna memoria para la nueva cadena en el montón, mientras usa strcpy (o es mas seguro strncpy variante) Puedo copiar una cadena en una memoria preasignada en cualquiera el montón o la pila.

  • ¿Por qué el enfático “cualquiera”? ¿No es posible usar strcpy copiar en un búfer estático?

    – KerrekSB

    24 de diciembre de 2012 a las 12:30

  • Traté de enfatizar la diferencia de uso entre las dos funciones sin saturar la respuesta con demasiados problemas de administración de memoria. pero sí, tienes razón sobre los búferes estáticos.

    – Oren

    24 de diciembre de 2012 a las 12:42

  • Si no quiere desorden, puede terminar la respuesta después de “memoria preasignada” 🙂

    – KerrekSB

    24 de diciembre de 2012 a las 12:51

  • pequeño detalle: strncpy no es más seguro que strcpy, ya que no garantiza que dest terminará en nulo. Peor aún, cualquier espacio no utilizado en el búfer de destino se llenará con terminadores nulos. Esta función nunca fue pensada para uso general. Si debe usar una de estas funciones, es mejor usar strcpy y finalizar manualmente dest.

    – Juan F.

    18 de noviembre de 2013 a las 9:27


avatar de usuario
heikki salokanto

En la respuesta aceptada, la implementación de strdup se presenta como:

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

Sin embargo, eso es algo subóptimo porque ambos strlen y strcpy necesita encontrar la longitud de la cadena comprobando si cada carácter es un \0.

Utilizando memcpy debería ser más eficiente:

char *strdup(const char *src) {
    size_t len = strlen(src) + 1;
    char *s = malloc(len);
    if (s == NULL)
        return NULL;
    return (char *)memcpy(s, src, len);
}

avatar de usuario
Bharat Ravindra

char *strdup(char *pszSrch);

strdup asignará almacenamiento del tamaño de la cadena original. Si la asignación de almacenamiento se realiza correctamente, la cadena original se copia en la cadena duplicada.

strdupvolver NULL sobre el fracaso Si no se asigna memoria, la copia falla strdup regreso NULL.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad