Si usted no sabe el tamaño exacto de la memoria es necesario utilizar, necesita la asignación dinámica (malloc
) . Un ejemplo podría ser cuando un usuario abre un archivo en su aplicación. Tendrá que leer el contenido del archivo en la memoria, pero, por supuesto, no conoce el tamaño del archivo por adelantado, ya que el usuario selecciona el archivo en el momento, en tiempo de ejecución. Entonces, básicamente necesita malloc
cuando no conoce el tamaño de los datos con los que está trabajando por adelantado. Al menos esa es una de las razones principales para usar malloc
. En su ejemplo, con una cadena simple que ya conoce el tamaño en tiempo de compilación (además de que no desea modificarla), no tiene mucho sentido asignarla dinámicamente.
poco fuera de tema, pero ... hay que tener mucho cuidado de no crear pérdidas de memoria cuando se utiliza 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;
}
¿Ve qué le pasa a este código? Hay una declaración de devolución condicional entre malloc
y free
. Puede parecer correcto al principio, pero piénselo. Si hay un error, vas a regresar sin liberar la memoria que asignaste. Esta es una fuente común de pérdidas de memoria.
Por supuesto, esto es un ejemplo muy simple, y es muy fácil de ver el error aquí, pero imagina cientos de líneas de código llenas de punteros, malloc
s, free
s, y todo tipo de control de errores. Las cosas pueden ponerse realmente desordenadas muy rápido. Esta es una de las razones por las que prefiero el C++ moderno en lugar de C en los casos aplicables, pero ese es otro tema.
Por lo tanto, siempre que use malloc
, siempre asegúrese de que su memoria sea lo más probable sea free
d como sea posible.
Re: * Me omite la comprobación de errores en aras de la brevedad * - por desgracia demasiados programadores * * omitir la comprobación de errores, ya que no se dan cuenta de 'malloc()' puede fallar! – Andrew