¿Cuándo y por qué usar malloc?


Bueno, no puedo entender cuándo y por qué se necesita 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 solo puedo usar student p;?

Author: jotik, 2012-01-10

5 answers

malloc se utiliza para la asignación dinámica de memoria. Como se ha dicho, es asignación dinámica lo que significa que asigna la memoria en tiempo de ejecución. Por ejemplo, cuando no sabes 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. Así que puede crear una matriz con 20 elementos estáticos. Su matriz podrá contener un máximo de 20 estudiantes. ¿Pero qué pasa si no sabes el número de estudiantes? Digamos que la primera entrada es el número de estudiante. Podrían ser 10, 20, 50 o lo que sea. Ahora tomará la entrada n = el número 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 en las que se necesita una asignación dinámica.

Eche un vistazo a la página de manual malloc(3).

 34
Author: taskinoor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-23 12:55:28

Utiliza malloc cuando necesita asignar objetos que deben existir más allá de la vida útil de ejecución del bloque actual (donde un copy-on-return también sería costoso), o si necesita asignar memoria mayor que el tamaño de esa pila (es decir, una matriz de pila local de 3mb es una idea mala).

Antes de que C99 introdujera VLA's, también necesitaba para realizar la asignación de una matriz de tamaño dinámico, sin embargo, es necesario para la creación de estructuras de datos dinámicas como árboles, listas y colas, que son utilizadas por muchos sistemas. probablemente hay muchas más razones, estas son solo algunas.

 16
Author: Necrolis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-24 13:59:47

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 implícitamente pasa por valor, en lugar de por referencia. En este ejemplo, si pasamos ' p ' a una función para hacer algún trabajo en ella, estaríamos creando una copia de toda la estructura. Esto usa memoria adicional (el total de cuánto espacio requeriría esa estructura en particular), es más lento y potencialmente no escala bien (más sobre esto en un minuto). Sin embargo, al pasar *p, no pasa 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, imagine un programa (como un sistema de información de estudiantes) que tendrá que crear y administrar un conjunto de registros en miles, o incluso decenas de miles. Si pasa toda la estructura por valor, tomará más tiempo operar en un conjunto de datos, que simplemente pasar un puntero a cada registro.

 12
Author: ArcticPhoenix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-28 02:29:53

Malloc = Asignación de memoria.

Si has pasado por otros lenguajes de programación, es posible que hayas usado la palabra clave 'new'.

Malloc hace exactamente lo mismo en C. Toma un parámetro, qué tamaño de memoria necesita ser asignado y devuelve una variable puntero que apunta al primer bloque de memoria de la

Bloque de memoria completo, que ha creado en la memoria. Ejemplo -

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

Ahora, * p apuntará al primer bloque del bloque entero consequtive 20 reservado en la memoria.

Puede atravesar cada bloque usando los operadores ++ y--. Todo lo mejor.

 3
Author: Acn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-10 08:47:27

En este ejemplo parece bastante inútil. Pero ahora imagine que está utilizando sockets o file IO y debe leer paquetes de longitud variable que solo puede disuadir mientras se ejecuta. O cuando se utilizan sockets y cada conexión cliente necesita algo de almacenamiento en el servidor. Usted podría hacer una matriz estática, pero esto le da un límite de cliente que será disuasión durante la compilación.

 0
Author: DipSwitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-10 08:48:27