2012-01-10 17 views
31

Bueno, no puedo entender cuándo y por qué es necesario asignar memoria usando malloc.¿Cuándo y por qué usar 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é se necesita para asignar memoria cuando puedo usar student p;?

+4

Mantener la programación en C y usted sabrá por qué. – insumity

+1

Lea un buen libro de programación de C. Explicará el montón de memoria asignada mucho mejor y más rápido de lo que puedo explicar en unos minutos. –

+0

Usted debe aprender acerca de las diferencias entre pila y pila de memoria, echar un vistazo a esta pregunta: http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap – jlledom

Respuesta

29

malloc se utiliza para la asignación dinámica de memoria. 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 usando malloc.

Este es solo 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).

+2

El hecho de que no se sepa cuánta memoria se necesita en el momento de la compilación no significa que el montón tenga que estar involucrado. –

+0

@Matt Joiner, ese fue UN solo ejemplo. Si crees que eso vale la pena votar, entonces no tengo nada que decir. – taskinoor

+0

@Matt Joiner, editó la respuesta un poco. Puede ser que suene mejor ahora. – taskinoor

13

Utiliza malloc cuando necesita asignar objetos que deben existir más allá del alcance del bloque actual (donde también sería costosa una copia en devolución), o si necesita asignar memoria mayor que el tamaño de esa pila (es decir: una matriz de pila local de 3 m es una idea mala idea).

Antes C99 introdujo VLA, también necesita que para llevar a cabo la asignación de una matriz dinámica de tamaño, sin embargo, su se necesita para la creación de estructuras de datos dinámicos, como los árboles, enumera & colas, que son utilizados por muchos sistemas. probablemente haya muchas más razones, estas son solo algunas.

+0

duración malloc'/'léxica alcance y de almacenamiento son dos cosas diferentes. Un objeto puede tener alcance de bloque y duración de almacenamiento estático. – ouah

+0

@ouah: entonces no sería un objeto asignado a la pila, que es a lo que me refiero. – Necrolis

+0

Antes de C99 puedes usar 'alloca'. Aparte de eso, esta es la respuesta más correcta, y debería marcarse la solución. –

1

malloc = Memory ALLOCation.

Si ha pasado por otros lenguajes de programación, es posible que haya usado la palabra clave 'nueva'.

Malloc hace exactamente lo mismo que en C. Se toma un parámetro, lo que el tamaño de la memoria tiene que ser asignado y devuelve una variable puntero que apunta al primer bloque de memoria de todo el bloque de memoria

, que has creado en la memoria. Ejemplo -

int *p = malloc(sizeof(int)*10); 

Ahora, * p apuntará al primer bloque del bloque 20 número entero consequtive reservada de la memoria.

Puede recorrer cada bloque con el operador ++ y -. Todo lo mejor.

0

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.

+1

Esta respuesta es engañosa. –

+0

por favor explicar – DipSwitch

+0

matrices de longitud variable pueden ser almacenados en la pila bien. Las matrices de longitud variable no son motivo para usar el montón. –

10

Ampliación de la estructura del ejemplo un poco, 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 del estudiante) que tendrá que crear y gestionar un conjunto de registros en los 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.

Cuestiones relacionadas