Domanda

Dato questo codice C compilato con gcc 4.3.3

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


int main(int argc, char * argv[])
{

    int * i;

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

    printf("%d\n", *i);
    return 0;

}

Mi aspetto che l'output sia quello che era nella memoria che malloc () restituisce, ma invece l'output è 0. Malloc sta azzerando la memoria che restituisce? In tal caso, perché?

È stato utile?

Soluzione

Lo stesso

malloc non azzera la memoria ma molti sistemi operativi azzerano la memoria richiesta dal programma per motivi di sicurezza (per impedire a un processo di accedere a informazioni potenzialmente sensibili utilizzate da un altro processo ).

Altri suggerimenti

La funzione malloc () non imposta la memoria allocata su alcun valore specifico. Se vuoi assicurarti che la memoria sia zero, usa calloc () o equivalente. Altrimenti, ottieni qualunque cosa ci fosse prima (che, nel tuo caso, potrebbe essere zero).

Il valore nella memoria allocata è ufficialmente indefinito. C99 afferma: La funzione malloc alloca spazio per un oggetto la cui dimensione è specificata dalla dimensione e il cui valore è indeterminato. malloc () può fare quello che vuole, incluso azzerarlo. Questo può essere deliberato, un effetto collaterale dell'implementazione o potresti avere solo molta memoria che sembra essere 0.

FWIW su OS X con gcc 4.0.1 di Apple Non riesco a farlo uscire neanche 0 anche facendo un sacco di allocazioni:

for( idx = 0; idx < 100000; idx++ ) {
    i = (int *) malloc(sizeof(int));
    printf("%d\n", *i);
}

Malloc non deve riempire la memoria. Per motivi di prestazioni, le versioni di rilascio spesso non fanno nulla con la memoria. Un "sicuro" la libreria potrebbe avere un'implementazione malloc che cancella la memoria. Spetta all'implementatore della libreria. Esistono alcuni schemi comuni che vengono riempiti in memoria dalle varie librerie di debug del compilatore che sono spiegato in questo argomento dello stackover .

Sicuramente non puoi dipendere dal fatto che è 0. mallocare un pezzo più grande e scaricarlo per vedere.

Se è int; int = 0; o int = 00000000; occuperà lo stesso spazio nella memoria. printf spesso cattura il primo 0 come terminatore nullo, indipendentemente da cos'altro si trova nella stringa. Se stai usando i comparatori di stringhe e 0 è un segnaposto, ti consiglio di usare ANYTHING ma 0 per quel segnaposto poiché le librerie basate su stringhe fanno davvero schifo. Prova F e poi scrivi il controllo in te stesso inserendo il termine null o la nuova riga in base alle necessità, sarà molto più portatile.

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