operaciones - Cuándo usar malloc para punteros de char
punteros en c ejemplos (5)
Estoy específicamente centrado en cuándo usar malloc en punteros de char
char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";
¿Sería un malloc para algo tan trivial como este? ¿Si es así por qué? Si no, ¿cuándo es necesario para los indicadores de char?
Cada vez que el tamaño de la cadena no está determinado en el momento de la compilación, debe asignar memoria con malloc (o algún método equivalente). En su caso, usted conoce el tamaño de sus cadenas en el momento de la compilación (sizeof ("something") y sizeof ("something else")).
Como lo indicaron otros, no necesita usar malloc solo para hacer:
const char *foo = "bar";
La razón para eso es exactamente que *foo
es un puntero: cuando inicializas foo
no estás creando una copia de la cadena, solo un puntero a donde vive "bar"
en la sección de datos de tu 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 usas 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, finalmente llegamos a un caso en el que es posible que desee malloc si está utilizando sprintf()
o, más seguro 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 */
Use malloc()
cuando no conoce la cantidad de memoria necesaria durante el tiempo de compilación. En caso de que tenga cadenas de solo lectura, entonces puede usar const char* str = "something";
. Tenga en cuenta que la cadena probablemente se almacene en una ubicación de memoria de solo lectura y no podrá modificarla. Por otro lado, si conoce la cadena durante el tiempo de compilación, puede hacer algo como: char str[10]; strcpy(str, "Something");
char str[10]; strcpy(str, "Something");
Aquí la memoria se asigna desde la pila y podrás modificar la str. El tercer caso es asignar usando malloc. Digamos que no conoce la longitud de la cadena durante el tiempo de compilación. Entonces puedes hacer char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);
char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);
malloc para caracteres únicos o enteros y calloc para matrices dinámicas. es decir pointer = ((int *)malloc(sizeof(int)) == NULL)
, puede hacer aritmética dentro de los corchetes de malloc
pero no debería porque debe usar calloc
que tiene la definición de void calloc(count, size)
que significa la cantidad de elementos que desea almacenar, es decir, el recuento y el tamaño de los datos, es decir, int
, char
, etc.
malloc
es para asignar memoria en la tienda libre. Si tiene un literal de cadena que no desea modificar, lo siguiente está bien:
char *literal = "foo";
Sin embargo, si desea poder modificarlo, utilícelo como un búfer para contener una línea de entrada y así sucesivamente, use malloc
:
char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */
// ...
free(buf);