Si no conoce el tamaño exacto de la memoria que necesita usar, necesita una asignación dinámica ( malloc
). Un ejemplo podría ser cuando un usuario abre un archivo en su aplicación. Deberá leer el contenido del archivo en la memoria, pero, por supuesto, no conoce el tamaño del archivo de antemano, ya que el usuario selecciona el archivo en el momento, en tiempo de ejecución. Entonces, básicamente, lo necesita malloc
cuando no conoce el tamaño de los datos con los que está trabajando de antemano. Al menos esa es una de las principales razones para consumir malloc
. En su ejemplo con una cadena simple cuyo tamaño ya conoce en el momento de la compilación (además de que no desea modificarlo), no tiene mucho sentido asignar eso dinámicamente.
Un poco fuera de tema, pero ... debes tener mucho cuidado de no crear pérdidas de memoria al usar malloc
. Considere este código:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
// Do some stuff
if ( /* some error occured */ ) return -1;
// Do some other stuff
free(someMemory);
return result;
}
¿Ves lo que está mal con este código? Hay una declaración de retorno condicional entre malloc
yfree
. Puede parecer bien al principio, pero piénselo. Si hay un error, volverá sin liberar la memoria que asignó. Esta es una fuente común de pérdidas de memoria.
Por supuesto, este es un ejemplo muy simple, y es muy fácil ver el error aquí, pero imagina cientos de líneas de código llenas de punteros, malloc
s,free
s, y todo tipo de manejo de errores. Las cosas pueden complicarse mucho muy rápido. Esta es una de las razones por las que prefiero C ++ moderno sobre C en los casos aplicables, pero ese es un tema completamente diferente.
Por lo tanto, siempre que lo use malloc
, asegúrese siempre de que su memoria tenga las mismasfree
posible.
malloc()
puede fallar.