Domanda

Quando abbiamo riallocare la memoria tramite realloc(), sono i contenuti precedenti over-scritti? Sto cercando di fare un programma che riassegna memoria ogni volta che si entra i dati in esso.

La prego di dirmi circa l'allocazione della memoria tramite realloc, è compilatore dipende per esempio?

È stato utile?

Soluzione

Non si preoccupi per i vecchi contenuti.

Il modo corretto di utilizzare realloc è quello di utilizzare un puntatore specifico per la riallocazione, test che puntatore e, se tutto ha funzionato bene, cambiare il vecchio puntatore

int *oldpointer = malloc(100);

/* ... */

int *newpointer = realloc(oldpointer, 1000);
if (newpointer == NULL) {
    /* problems!!!!                                 */
    /* tell the user to stop playing DOOM and retry */
    /* or free(oldpointer) and abort, or whatever   */
} else {
    /* everything ok                                                                 */
    /* `newpointer` now points to a new memory block with the contents of oldpointer */
    /* `oldpointer` points to an invalid address                                     */
    oldpointer = newpointer;
    /* oldpointer points to the correct address                                */
    /* the contents at oldpointer have been copied while realloc did its thing */
    /* if the new size is smaller than the old size, some data was lost        */
}

/* ... */

/* don't forget to `free(oldpointer);` at some time */

Altri suggerimenti

Cresce la memoria già allocata senza sovrascrivere il contenuto esistente, o (se è in grado di crescere) alloca nuova memoria più grande in una posizione diversa e copia il contenuto dalla memoria precedente esistenti in una nuova memoria.

Si dovrebbe programmare come se il vecchio puntatore viene sovrascritto, sì. La vecchia memoria non viene allocata in modo può essere ri-assegnato da un'altra parte del vostro programma (o un thread di sistema, per esempio) e scritto nel corso in qualsiasi momento dopo si chiama realloc.

La nuova memoria sarà sempre contenere gli stessi dati che erano presenti nella vecchia memoria anche se (è copiato per voi, se necessario), ma solo fino alla dimensione del vecchio blocco, qualsiasi spazio in più distribuito alla fine sarà Non inizializzato.

Se si desidera una copia poi fare un nuovo malloc e l'uso memcpy.

Attuazione-saggio, quando si chiama realloc per aumento le dimensioni, una di queste cose potrebbe accadere:

  • Un nuovo blocco viene allocato e il contenuto della vecchia memoria copiata, il vecchio blocco viene liberato, viene restituito il nuovo puntatore.
  • Se l'area dopo il blocco non è esaurito, il blocco esistente può essere estesa e lo stesso puntatore restituito.

Dal momento che non si ha modo di sapere quale è successo, o anche se si utilizza un completamente diversa implementazione a quello suggerito sopra, si dovrebbe sempre il codice in base alle specifiche di realloc, che è che non è necessario utilizzare il vecchio puntatore qualsiasi di più ed è necessario utilizzare quello nuovo.

E 'difficile dire quello che stai chiedendo, ma se si sta chiedendo se è possibile leggere i "vecchi contenuti" al vecchio indirizzo passato a realloc, la risposta è non . In alcuni casi, si può trovare una parte o tutti i vecchi contenuti lì, ma a meno che realloc restituito lo stesso puntatore passato a esso, qualsiasi uso del vecchio puntatore è comportamento non definito .

Se si sta solo chiedendo se i vecchi contenuti saranno conservati presso il nuovo indirizzo restituito da realloc, la risposta è sì (fino al minimo del vecchio formato e la nuova dimensione).

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