Un programa esta formado por su stack y por su heap, al primero van a parar todo lo estatico , todo lo que declaramos con por ejemplo corchetes char buff [255]; por ejemplo; y al segundo va la memoria que pedimos en medio de ejecución, que generalemtne no sabemos cuanto es, por eso no declaramos variables de antemano.

pero gracias a dios tenemos la función malloc, lo que hace esta función es devolvernos un puntero a un espacio reservado de memoria en el heap, para que podamos guardar datos. por ejemplo

en C general , windows, solaris o linux

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

main()
{
char *buf;
int tamanio;

printf("Ingrese el tamaño que quiere asignar al buffer\n");
scanf("%d", &tamanio);

buf = (char *) malloc(tamanio + 1);

getchar();
free(buf);
}
muy importante, para cada malloc que usemos, tenemos que hacer un free, para liberar la memoria que alocamos.

En windows tenemos otra manera de manejar memoria dinamica, y a diferencia de las funciones basicas de c, en windows se pueden crear "heaps" privados.

Windows

Código: Seleccionar todo

#include <stdio.h>
#include <windows.h>


main()
{
char *buf;
int tamanio;
HANDLE heap;
heap = HeapCreate(HEAP_NO_SERIALIZE,0,9045);

printf("Ingrese el tamaño que quiere asignar al buffer\n");
scanf("%d", &tamanio);

buf =(char *) HeapAlloc(heap,0,tamanio);

printf("buffer creado\n");
scanf("%d", &tamanio);
HeapFree(heap,0,buf);   /* liberamos la variable*/
HeapDestroy(heap); /*liberamos el heap completo */
}
HeapCreate , crea un heap privado con el tamaño que le especificamos
HeapAlloc , aloca memoria de un heap privado q le pasemos por parametro, y una cant que tambien le asignamos (no debe ser mayor a la del heap creado)
HeapFree, libera variables alocadas
HeapDestroy libera un heap entero.


Nota, malloc(1024) es lo mismo que hacer HeapAlloc(GetProcessHeap,0,1024);
dado que ambos usan el heap que viene con el proceso ya creado.

Otro tema importante para ver, son las listas que se pueden hacer gracias a la memoria dinamicas.
y se manejan por nodos de informacion y un puntero, por ejemplo el primer nodo esta formado por un valor y un puntero a un nodo siguiente
y asi podemos ir armando estructuras dinamicas muy poderosas y rapidas.


espero que les sirva, saludos.

Leos
No hay éxito como el fracaso, pero el fracaso no es ningun éxito...
en c++ seria algo mas o menos asi

Código: Seleccionar todo

#include <iostream.h>


void main()
{
	long tamanyo;
	int *dir;
	int nbloque;
	cout << "¿Tamaño (longitud) deseado?";
	cin >> tamanyo;
	for (nbloque = 1;nbloque<= tamanyo;nbloque++)
	{
		dir = new int[tamanyo];
		cout << "Asignación bloque número:" << nbloque << endl;
	}
}

Código: Seleccionar todo

#include <iostream.h>


void main()
{
char Jojo[22] = "VIVAN LOS PUNTEROS XD";
for (int n = 0;n<=21;n++)
{
	cout << Jojo[n];
}

}
excelente, pero acordate que siempre que haya un new, tiene que haber un delete
asi como por cada malloc , tiene que haber un free.

:P saludos!!
No hay éxito como el fracaso, pero el fracaso no es ningun éxito...
Responder

Volver a “Fuentes”