2011-02-02 14 views
5

Utilicé el siguiente código para averiguarlo, pero siempre obtengo 1 como respuesta. Hay algo mal. Gracias¿Cuántos GB pueden asignar malloc para su programa?

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

int main(){ 
    int mult = 0; 
    int chk =8; 
    do{ 
     mult+=1; 
     int *p = (int*)malloc(1024*1024*1024*mult); 
     if(p==0){ 
      chk =0; 

     }else{ 
      free(p); 
     } 
    }while(chk !=0); 
    mult = mult -1; 
    printf("The number of gigs allocated is : %d\n",mult); 
    return 0; 
} 

Solo para ayudar, tengo un sistema de 64 bits con Windows y Linux instalados. Por lo tanto, ¿es correcta la lógica anterior aunque obtengo solo 1 gb como respuesta en un sistema de 64 bits?

+0

Depende de su o/s. Puede depender de los límites establecidos por el o/s, que pueden ser ajustados por usuarios con privilegios apropiados. ¿Has intentado asignar 1023 * 1024 * 1024 * 2? –

+4

Creo que este código corre el riesgo de sufrir un desbordamiento de enteros, si int es una variable de 32 bits con signo. Intente hacer que las constantes sean largas (o sin firmar por mucho tiempo si su compilador lo tiene). – unwind

+0

@unwind Eso funcionó para mí. Pude pasar más de 500 GB antes de apagarlo. (Mac OS X usa 'mmap()' más allá de un cierto tamaño.) Haga una respuesta a su comentario para que yo pueda votar. – chrisaycock

Respuesta

3

Si se trata de un sistema operativo de 32 bits, entonces no es sorprendente que el bloque contiguo más grande sea de 1 GB (o en algún lugar entre eso y 2 GB). En un SO de 64 bits, serían posibles bloques más grandes.

Si cambia su código para asignar piezas individuales más pequeñas, es probable que pueda asignar más de 1 GB en total.

+1

A veces, puede obtener hasta 3, 3,5 GB en un sistema de 32 bits. 4 GB es el límite estricto, por supuesto. Es un valor menor que * que *. –

+0

@Jonathan: Iba a mencionar números en mi respuesta y luego lo pensé mejor ya que no sabía qué plataforma estaba usando. Además, hay otros problemas, como la fragmentación a considerar. Asignar bloques de 1MB en un bucle "exageraría" el máximo en comparación con la mayoría de las aplicaciones del mundo real (al menos en mi experiencia). –

+0

@Jonathan: Si un sistema operativo de 32 bits le permite asignar más de 2 gb contiguos y aún tiene un 'ptrdiff_t' de 32 bits, está ** roto ** y ** no conforme ** (dará el signo incorrecto para diferencias de puntero, que pueden ser extremadamente peligrosas!). –

1
int main(void){ 
    int MB = 0; 
    while(malloc(1<<30)){ 
     ++MB; 
    } 
    printf("The number of gigs allocated is : %d\n",MB); 
    return EXIT_SUCCESS; 
} 
+1

¿Qué se supone que debe mostrar? Es muy fácil entrar en una situación en la que malloc puede regresar sin error pero asignar más espacio del que realmente tiene. Eche un vistazo al "exceso de memoria" – Falmarri

Cuestiones relacionadas