Tenía curiosidad con esto:
¿Cuál es la diferencia entre:
const int MAX_BUF = 1000; char* Buffer = malloc(MAX_BUF);y:
char Buffer[MAX_BUF];Caso 1: En
char Buffer[MAX_BUF]; Buffer es una matriz de tamaño MAX_BUF . La técnica de asignación se llama VLA .
Caso 2: En
const int MAX_BUF = 1000; char* Buffer = malloc(MAX_BUF); Buffer es un puntero al que se le asigna una memoria de tamaño MAX_BUF que es 1000 .
y, una matriz no es lo mismo que un puntero, y C-FAQ tiene una colección Muy buena que detalla las razones .
La principal diferencia, en términos de usabilidad y comportamiento son:
malloc() d debe estar free() d. [ Cortesía: Jorge ]Nota: Wiki
Por ejemplo, GNU C Compiler asigna memoria para VLA en la pila.
Agregaré un poco de información en términos de administración de memoria, además de lo que otros dijeron.
1) La principal diferencia está aquí:
const int MAX_BUF = 1000; char* Buffer = malloc(MAX_BUF); Debe administrar la memoria asignada manualmente, por ejemplo, liberar el Buffer cuando termine de usarlo. Olvidarse de free (o liberarlo dos veces) puede ocasionar problemas.
2) Con el segundo caso:
char Buffer[MAX_BUF];No necesitas liberar nada. Se destruirá automáticamente. Por lo tanto, evita la tarea de manejar la memoria, lo cual es bueno. Debe intentar evaluar siempre qué enfoque necesita.
Algunos puntos.
char* Buffer = malloc(MAX_BUF); crea un Buffer de puntero char , asigna dinámicamente MAX_BUF bytes de memoria a través de malloc y hace que Buffer apunte al inicio del espacio asignado. Esta memoria se asigna en el montón.
char Buffer[MAX_BUF]; crea un Buffer de matriz de tamaño MAX_BUF que puede contener un máximo de MAX_BUF caracteres. Tenga en cuenta que está creando una matriz de longitud variable (una característica introducida en C99 ) ya que MAX_BUF es una variable. Esta matriz se puede crear en la pila.