2011-02-02 9 views
5

Ho usato il seguente codice per scoprirlo ma ottengo sempre 1 come risposta. c'è qualcosa di sbagliato. GrazieQuanti GB possono allocare malloc per il programma

#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 per aiutare, ho un sistema a 64 bit con Windows e Linux installato. Quindi, la logica di cui sopra è corretta anche se sto ottenendo solo 1 GB come risposta su un sistema a 64 bit?

+0

Essa dipende dalla vostra o/s. Può dipendere dai limiti impostati dall'o/s, che può essere regolato da utenti opportunamente privilegiati. Hai provato a allocare 1023 * 1024 * 1024 * 2? –

+4

Penso che questo codice rischia di soffrire di overflow di interi, se int è una variabile a 32 bit con segno. Prova a rendere le costanti non firmate a lungo (o non firmate long long se il tuo compilatore ce l'ha). – unwind

+0

@unwind Questo ha funzionato per me. Sono stato in grado di superare i 500 GB prima di spegnerlo. (Mac OS X usa 'mmap()' oltre una certa dimensione.) Rendi il tuo commento una risposta in modo che io possa votare. – chrisaycock

risposta

3

Se si tratta di un sistema operativo a 32 bit, non sorprende che il blocco contiguo più grande sia 1 GB (o qualcosa tra 2 e 2 GB). Su un sistema operativo a 64 bit, sarebbero possibili blocchi più grandi.

Se si modifica il codice per allocare pezzi singoli più piccoli, è probabile che sia possibile allocare più di 1 GB in totale.

+1

A volte, è possibile ottenere fino a circa 3, 3,5 GB sul sistema a 32 bit. 4 GB è il limite difficile, ovviamente. È un valore inferiore a * che *. –

+0

@ Jonathan: stavo per menzionare i numeri nella mia risposta e poi ci ho pensato meglio poiché non sapevo quale piattaforma stava usando. Inoltre ci sono altre questioni come la frammentazione da considerare. Assegnare blocchi di 1 MB in un ciclo "esagererebbe" il massimo rispetto alla maggior parte delle applicazioni del mondo reale (almeno nella mia esperienza). –

+0

@Jonathan: Se un sistema operativo a 32 bit consente di allocare più di 2 GB contigui e ha ancora un 'ptrdiff_t' a 32 bit, è ** rotto ** e ** non conformante ** (produrrà il segno sbagliato per differenze di puntatore, che potrebbero essere estremamente pericolose!). –

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

Cosa dovrebbe mostrare? Puoi facilmente entrare in una situazione in cui malloc può tornare senza errori, ma allocare più spazio di quello che hai effettivamente. Dai un'occhiata a "memoria overcommit" – Falmarri

Problemi correlati