Domanda

int main ()
{
    int * b;
    b = (int*) malloc (1);
    *b=110000;
    free (b);
    return 0;
}

Perché danneggiamento di heap accadere in free (b);?

IMO, danneggiamento di heap avviene già a *b=110000;.

È stato utile?

Soluzione

argomento della malloc() è il numero di byte da allocare. È necessario utilizzare:

b = (int*) malloc(sizeof(int));

Hai assegnato a blocchi di un troppo piccolo, e quindi scritti più byte ad esso che avete assegnato, che sovrascrive le informazioni contabilità accanto al blocco, corrompendo il mucchio.

Altri suggerimenti

E 'a * b = 110000; Perché si assegnano la memoria per un byte, e assegnando un int in esso, che è più di un byte. O si può avere b = (int *) malloc (sizeof (int)) o al posto di int * b si può avere char * b e poi il cast del puntatore malloced a char *. Il codice sarà anche può funzionare se si assegna un valore che è inferiore a 128 (a causa del char firmato) a * b.

EDIT: - Penso che a volte anche questo funzionerà senza alcun problema. Poiché il compilatore può scegliere di destinare più di un byte di memoria per un accesso veloce dei dati.

Il danneggiamento dell'heap avviene infatti già alla assegnazione *b=11000, ma non viene rilevato finché la chiamata free(b) perché questo è il primo punto in cui l'integrità del cumulo viene nuovamente controllato.

verifica dell'integrità mucchio ogni assegnazione (o anche ogni assegnazione coinvolge un puntatore Dereferenced) rallenterebbe maggior parte dei programmi giù troppo e sarebbe legare il compilatore troppo strettamente all'attuazione libreria. Per questo motivo, i controlli di integrità vengono eseguite solo quando l'heap viene manipolato, che è nelle funzioni malloc e free (e amici).

Il codice scrive più dati al blocco di memoria dello spazio a sua disposizione, quindi, corrompendo l'inizio del successivo blocco di memoria valido.

Utilizzando char * piuttosto che int * e la scrittura di un valore di -128 a 127 a * b dovrebbe risolvere il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top