Como se ha indicado por los demás, no es necesario utilizar malloc justo hacer
const char *foo = "bar";
La razón de esto es exactamente lo que *foo
es un puntero cuando — initialize foo
no está creando una copia de la cadena, solo un puntero al lugar donde "bar"
vive en la sección de datos del ejecutable. Puedes copiar ese puntero todas las veces que quieras, pero recuerda que siempre apuntan hacia la misma instancia de esa cadena.
Entonces, ¿cuándo deberías usar malloc? Normalmente utiliza strdup()
para copiar una cadena, que maneja el malloc en el fondo. p.ej.
const char *foo = "bar";
char *bar = strdup(foo); /* now contains a new copy of "bar" */
printf("%s\n", bar); /* prints "bar" */
free(bar); /* frees memory created by strdup */
Ahora, por fin tenemos en torno a un caso en el que es posible que desee malloc si está usando sprintf()
o, de forma más segura snprintf()
que crea/formatea una nueva cadena.
char *foo = malloc(sizeof(char) * 1024); /* buffer for 1024 chars */
snprintf(foo, 1024, "%s - %s\n", "foo", "bar"); /* puts "foo - bar\n" in foo */
printf(foo); /* prints "foo - bar" */
free(foo); /* frees mem from malloc */
¿Qué podría pasar con: char * foo = "bar"; char * bar = foo; printf ("% s \ n", barra); – ZPS
Primero, debería ser 'const char * foo ...', segundo, en su ejemplo que solo copia el puntero, no los datos. 'strdup()' también copia los datos. – scotchi
Se propuso una edición aquí lanzando el resultado del malloc a '(char *)'. Esto es necesario cuando este código se usa en C++, pero generalmente este código * no debe * usarse en C++, por lo que revertí la edición. – scotchi