Author Topic: malloc() en C  (Read 47498 times)

clay

  • Jr. Member
  • **
  • Posts: 94
  • Karma: 0
    • View Profile
    • IFX
malloc() en C
« on: Abril 04, 2008, 01:46:51 pm »
Hola:

Tengo una duda con respecto a la funcion malloc(), es decir, se usa para reservar espacio de memoria, no es asi? y esto sucede con los punteros mas especificamente, pero cuando debo usar malloc()?

Por ejemplo:

Cuando se usan structs he visto el uso de malloc(), pero cuando referencio a la direccion de memoria de un int normal por ejemplo:

int n = 5;
int *ptr = &n;

Ahi no use malloc(). O solo se usa para los "objetos", asi como en java existe el "new"; en este caso,  malloc() en C, vendría a ser el equivalente de "new" en Java?

Agradezco de antemano su respuesta.

Saludos.

dfc

  • Newbie
  • *
  • Posts: 13
  • Karma: 0
    • View Profile
Re: malloc() en C
« Reply #1 on: Abril 04, 2008, 02:19:17 pm »
Cuando apuntas a un entero no es necesario reservar memoria porque para un entero el ordenador ya sabe que tiene que reservar 4 bytes en memoria, es decir un espacio determinado.

En cambio cuando creas una estructura dinámica, tienes que decir cuanto espacio de memoria vas a utilizar para esa estructura, eso se hace con la función malloc. Al ser un elemento creado por el programador y no un tipo primitivo, hay que decirle al ordenador cuanto espacio de memoria se necesita para esa estructura.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: malloc() en C
« Reply #2 on: Abril 04, 2008, 02:39:25 pm »
Hola:

Un puntero para que esté bien y puedas usarlo, debe apuntar a una dirección de memoria donde haya un espacio de memoria reservado para trabajar.

Tienes dos formas de reservar espacio de memoria, una es declarando variables (da igual que sean de tipo simple o estructuras) y la otra haciendo malloc.

Declarando variables, sería válido esto

Code: [Select]
int a;
int *p = &a;

struct Estructura b;
struct Estructura *q = &b;

Si no tienes ninguna variable a la que apuntar, entonces debes reservar el espacio de memoria con malloc, y nuevamente da igual el tipo de variable que sea. Sería válido

Code: [Select]
int *p = malloc(sizeof(int));

struct Estructura *q = malloc(sizeof(struct Estructura));

Recuerda que para no perder memoria, por cada malloc(), cuando no necesites esa zona de memoria, debe haber un free().

Se bueno.

dfc

  • Newbie
  • *
  • Posts: 13
  • Karma: 0
    • View Profile
Re: malloc() en C
« Reply #3 on: Abril 04, 2008, 04:54:35 pm »
A la pregunta de cuando debes usar malloc(). Mi respuesta es que cuando no sepas cuanto espacio necesitas reservar, entonces necesitas utilizar malloc(), sino no hace falta.

clay

  • Jr. Member
  • **
  • Posts: 94
  • Karma: 0
    • View Profile
    • IFX
Re: malloc() en C
« Reply #4 on: Abril 16, 2008, 04:43:06 am »

Recuerda que para no perder memoria, por cada malloc(), cuando no necesites esa zona de memoria, debe haber un free().


Una pregunta mas...y cuando haga esto:

int x = 5;
int p* = &x;

¿Ahi no debo liberar espacio de memoria del puntero p? ¿Como se cuando liberar memoria y cuando no y que sucedería si no lo hago?

Ademas siempre escucho lo de "punterro descarriado"; ¿a que se refieren con esto?

Gracias.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: malloc() en C
« Reply #5 on: Abril 16, 2008, 05:02:52 am »
Hola:

Imagina un puntero como una flecha que apunta a un sitio en la memoria. malloc() o free() no tienen nada que ver con el puntero en sí, sino con la zona de memoria a la que se apunta.

Si tu haces

int x=5;

esto hace que el compilador reserve una zona de memoria de cuatro bytes a la que llama x y mete dentro un 5. Si ahora haces

int p* = &x;

estás haciendo que una flecha p apunte a esa dirección de memoria x. Como tú no has reservado esa zona de memoria (lo ha hecho el compilador al declarar la variable), NO tienes que liberar tú esa memoria (lo hará el compilador cuando esa variable deje de existir).

Cuando haces malloc(tamaño), estás diciendole al sistema operativo que te reserve una zona de memoria de tamaño. Puesto que tu has pedido esa memoria, el sistema operativo no la liberará hasta que tú se lo pidas, con un free().

Como los punteros son flechas y los haces apuntar a un sitio y otro durante la ejecución del programa, es bastante habitual (más de lo que nos gustaría) que alguno de esos puntero quede apuntando a un sitio incorrecto. Por ejemplo, si haces esto

int *p = malloc(tamaño);
...
free(p);

Ahora p está apuntando a una zona de memoria que ya NO está reservada. Si no eres cuidadoso, puedes no darte cuenta y seguir usando p como si apuntara a una zona de memoria válida. En ese caso se dice que p es un "puntero descarriado"

Aquí tienes algunos motivos por lo que es fácil que un puntero se vaya de madre.

Se bueno.

lyonn

  • Newbie
  • *
  • Posts: 1
  • Karma: 0
    • View Profile
Re: malloc() en C
« Reply #6 on: Julio 01, 2009, 06:43:40 am »
No lo hago en un hilo nuevo porque va totalmente relacionado y no es bueno duplicar información.

La idea es crear un tipo de dato con el que pueda hacer operaciones aritméticas y pueda contener números enteros enormes, mayores a los primivitos.

Code: [Select]
#include <stdio.h>
#include <stdlib.h>
#define N 100

int main()
{
int a = 1;
int b = 1;
int *c = 0;
int *test;
c=malloc(20);
while(b<=N)
    {
        c=a*b;
        printf("b: %d a: %d c: %d\n",b,a,c);
        a=c;
        b++;


    }

printf("tam: %d", sizeof(test) );
free(c);
return 0;
}


Veo que me da problemas para crear el almacen, si cambio la línea del malloc por:

Code: [Select]
c=(int *) malloc(300*sizeof(int));
Me da 4bytes (lógico si hablamos de un int)

Saludos

 

ey