Soy relativamente nuevo en 'C' y agradecería alguna información sobre este tema.
Básicamente, estoy tratando de crear una matriz de 16 MB y verificar si el contenido de la memoria se inicializa a cero o '\ 0' o algún valor de basura para un proyecto escolar.
Algo como esto:
char buffer[16*1024*1024];
Sé que hay un límite en el tamaño de la pila de programas y, obviamente, tengo una falla de segmentación. ¿Se puede hacer esto de alguna manera usando malloc()?
Puede inicializar la memoria con malloc así:
#define MEM_SIZE_16MB ( 16 * 1024 * 1024 ) char *buffer = malloc(MEM_SIZE_16MB * sizeof(char) ); if (buffer == NULL ) { // unable to allocate memory. stop here or undefined behavior happens }Luego puede verificar los valores en la memoria (tenga en cuenta que esto se imprimirá durante mucho tiempo):
for (int i = 0; i < MEM_SIZE_16MB; i++) { if( i%16 == 0 ) { // print a newline and the memory address every 16 bytes so // it's a little easier to read printf("\nAddr: %08p: ", &buffer[i]); } printf("%02x ", buffer[i]); } printf("\n"); // one final newlineNo olvides liberar la memoria cuando termines.
free(buffer);Por supuesto:
int memSize = 16*1024*1024; char* buffer = malloc( memSize ); if ( buffer != 0 ) { // check contents for ( i = 0; i < memSize; i++ ) { if ( buffer[i] != 0 ) { // holler break; } } free( buffer ); }Sí, probablemente necesitará hacer esto usando malloc() , y he aquí por qué:
Cuando se inicia cualquier programa (proceso... subproceso...) , se le proporciona una porción de memoria que utiliza para almacenar (entre otras cosas...) variables "locales". Esta área se llama "la pila ". Seguramente no será lo suficientemente grande para almacenar 16 megabytes.
Pero hay otra área de la memoria que cualquier programa puede usar: su " montón ". Esta área (como su nombre, "montón", pretende implicar...) no tiene una estructura inherente: es simplemente un grupo de almacenamiento y, por lo general, es lo suficientemente grande como para almacenar muchos megabytes. Simplemente malloc() el número de bytes que necesita, y free() esos bytes cuando haya terminado.
Simplemente defina un type que corresponda a la estructura que necesita almacenar, luego malloc(sizeof(type)) . El almacenamiento vendrá del montón. (Y para eso, básicamente, es el montón...)
Por cierto, hay una función de biblioteca llamada calloc() que reservará un área que es "cero conocido". Además, podría usar trucos inteligentes del sistema operativo para hacerlo de manera muy eficiente.