¿Por qué necesitamos strdup ()?

Mientras trabajaba en una tarea, llegué a saber que no deberíamos usar tareas como:

char *s="HELLO WORLD"; 

Los progtwigs que usan tales syntax son propensos a fallar.

Probé y utilicé:

  int fun(char *temp) { // do sum operation on temp // print temp. } fun("HELLO WORLD"); 

Incluso lo anterior funciona (aunque la salida es comstackdora y estándar específica).

En su lugar, deberíamos probar strdup () o usar const char *

He intentado leer otras preguntas similares en el blog, pero no pude entender el concepto de POR QUÉ EL CÓDIGO ANTERIOR NO DEBE TRABAJAR.

¿Se asigna memoria? ¿Y qué diferencia hace const?

Vamos a aclarar las cosas un poco. Nunca necesitas específicamente strdup . Es solo una función que asigna una copia de un char* en el montón. Se puede hacer de muchas maneras diferentes, incluso con buffers basados ​​en stack. Lo que necesitas es el resultado, una copia mutable de un char* .

La razón por la que el código que has enumerado es peligroso es que pasa lo que realmente es una cadena constante desde una cadena literal a una ranura que espera una cadena mutable. Desafortunadamente, esto está permitido en el estándar C, pero es extremadamente peligroso. Escribir en una cadena constante producirá resultados inesperados y con frecuencia se bloquea. La función strdup soluciona el problema porque crea una copia mutable que se coloca en una ranura esperando una cadena mutable.

Los literales de cadena se almacenan en el segmento de datos del progtwig. La manipulación de sus punteros modificará la cadena literal, lo que puede llevar a … resultados extraños en el mejor de los casos. Use strdup() para copiarlos en el espacio asignado en stack o en stack.

Los literales de cadena pueden almacenarse en porciones de memoria que no tienen privilegios de escritura. Intentar escribirles causará un comportamiento indefinido. const significa que el comstackdor se asegura de que no se escriba el puntero, lo que garantiza que no invoque un comportamiento indefinido de esta manera.

Este es un problema en C. Aunque los literales de cadena son char * no se pueden modificar, por lo tanto son const char* .

Si está utilizando gcc , puede usar -Wwrite-strings para verificar si está usando literales de cadena correctamente.

Lee mi respuesta en (array & string) Diferencia entre Java y C. Contiene la respuesta a su pregunta en la sección sobre cadenas.

Debe comprender que existe una diferencia entre la asignación estática y la asignación de memoria y que no recurre a los mismos espacios de memoria.