memoria - malloc y calloc
¿Cuándo y por qué usar malloc? (5)
Ampliando un poco la estructura del ejemplo, considere esto:
#include <stdio.h>
int main(int argc, const char *argv[]) {
typedef struct {
char* name;
char* sex;
char* insurace;
int age;
int yearInSchool;
float tuitionDue;
}student;
//Now I can do two things
student p;
//or
student *p = (student *)malloc(sizeof(student));
return 0
}
C a es un lenguaje que pasa implícitamente por valor, en lugar de por referencia. En este ejemplo, si pasamos ''p'' a una función para hacer algo de trabajo en ella, estaríamos creando una copia de toda la estructura. Esto usa memoria adicional (el total de espacio que requeriría esa estructura particular), es más lenta y potencialmente no se escala bien (más sobre esto en un minuto). Sin embargo, al pasar * p, no pasamos toda la estructura. Solo estamos pasando una dirección en la memoria que se refiere a esta estructura. La cantidad de datos pasados es menor (tamaño de un puntero), por lo tanto, la operación es más rápida.
Ahora, sabiendo esto, imagina un programa (como un sistema de información para estudiantes) que tendrá que crear y administrar un conjunto de registros de miles o incluso decenas de miles. Si pasa toda la estructura por valor, le llevará más tiempo operar en un conjunto de datos, que simplemente pasar un puntero a cada registro.
Bueno, no puedo entender cuándo y por qué es necesario asignar memoria usando malloc
.
Aquí está mi código:
#include <stdlib.h>
int main(int argc, const char *argv[]) {
typedef struct {
char *name;
char *sex;
int age;
} student;
//Now I can do two things
student p;
//or
student *ptr = (student *)malloc(sizeof(student));
return 0;
}
¿Por qué es necesario asignar memoria cuando puedo usar student p;
?
En este ejemplo, parece bastante inútil. Pero imagine que está utilizando sockets o archivos IO y debe leer paquetes de longitud variable que solo puede evitar mientras se ejecuta. O al usar sockets y cada conexión de cliente necesita algo de almacenamiento en el servidor. Podría hacer una matriz estática, pero esto le da un límite de cliente que será determinante durante la compilación.
Utiliza malloc
cuando necesita asignar objetos que deben existir más allá de la duración de la ejecución del bloque actual (donde también sería costosa una copia en el retorno), o si necesita asignar memoria mayor que el tamaño de esa pila (es decir, una matriz de pila local de 3 mb es una mala idea).
Antes de que C99 introdujera los VLA, también era necesario que realizara la asignación de una matriz de tamaño dinámico, sin embargo, es necesaria para la creación de estructuras de datos dinámicos como árboles, listas y colas, que son utilizados por muchos sistemas. probablemente haya muchas más razones, estas son solo algunas.
malloc = asignación de memoria.
Si ha pasado por otros lenguajes de programación, es posible que haya usado la palabra clave ''nueva''.
Malloc hace exactamente lo mismo en C. Toma un parámetro, qué tamaño de memoria necesita asignarse y devuelve una variable de puntero que apunta al primer bloque de memoria del
todo el bloque de memoria, que has creado en la memoria. Ejemplo -
int *p = malloc(sizeof(int)*10);
Ahora, * p señalará el primer bloque del consecutivo 20 entero bloqueado reservado en la memoria.
Puede atravesar cada bloque usando el operador ++ y -. Todo lo mejor.
malloc
se utiliza para la asignación de memoria dinámica. Como se dijo, es asignación dinámica lo que significa que asigna la memoria en tiempo de ejecución. Por ejemplo, cuando no conoce la cantidad de memoria durante el tiempo de compilación.
Un ejemplo debería aclarar esto. Digamos que sabes que habrá un máximo de 20 estudiantes. Entonces puede crear una matriz con 20 elementos estáticos. Su matriz podrá mantener un máximo de 20 estudiantes. Pero, ¿y si no sabes la cantidad de estudiantes? Digamos que la primera entrada es la cantidad de estudiantes. Podría ser 10, 20, 50 o lo que sea. Ahora tomará input n = la cantidad de estudiantes en tiempo de ejecución y asignará esa cantidad de memoria dinámicamente utilizando malloc
.
Esto es sólo un ejemplo. Hay muchas situaciones como esta donde se necesita una asignación dinámica.
Eche un vistazo a la página del manual malloc(3) .