Il seguente codice libera la memoria allocata per x
?Libera un puntatore assegnato
int main()
{
char *x = (char*)calloc(100, sizeof(char));
char *y = x;
free(y);
}
Il seguente codice libera la memoria allocata per x
?Libera un puntatore assegnato
int main()
{
char *x = (char*)calloc(100, sizeof(char));
char *y = x;
free(y);
}
Sì
Quando si esegue
char *y = x;
apportate y
punto alla posizione in cui x
punti. Dal momento che y
punta a una locazione di memoria restituita da calloc
,
free(y);
è perfettamente valida.Come @hacckscommented, questo non funzionerebbe se si effettua il punto in un'altra posizione di memoria, a condizione che questa posizione di memoria non sia stata restituita da malloc
/calloc
/realloc
.
In C, si should not cast the result of malloc
/calloc
/realloc
. Inoltre, controllare il valore di ritorno di calloc
per vedere se ha avuto successo è buono. calloc
restituirà NULL
in caso di errore.
Sarebbe bello se si aggiungesse che questo non funziona se 'y' è riassegnato ad un'altra posizione di memoria. – haccks
Tecnicamente, 'free (NULL)' è legale e non operativo, quindi in questo esempio estremamente semplicistico, il codice OP è perfettamente in grado di non controllare il valore restituito. – Kevin
@haccks, fatto :) –
La versione originale della questione avevano
int *y = x;
free(y);
Vale a dire assegnare il puntatore char
a un puntatore int
e quindi richiamare free()
sul puntatore int
. La firma di free()
è void free(void *ptr);
quindi indipendentemente dallo char *
rispetto allo int *
, la memoria verrebbe rilasciata.
La versione modificata (e attuale) della questione ha
char *y = x;
free(y);
Qui, entrambi y
e x
punti alla stessa memoria. Questo è noto come aliasing del puntatore. Dopo la chiamata a free()
, quella memoria sarebbe stata sicuramente rilasciata.
Un problema, tuttavia, è che dopo free(y)
, il puntatore x
sarebbe penzoloni, cioè la memoria si sta puntando non è più valida.
Nota: non è necessario né consigliabile trasmettere il valore restituito da calloc
.
'char * x = ...; int * y = x; 'provoca un comportamento non definito, dovuto all'assegnazione a un tipo di puntatore incompatibile. Successivamente può succedere di tutto. Quindi la risposta corretta sarebbe "* Può essere. *". – alk
L'assegnazione di "a un tipo di puntatore incompatibile" non ha, di per sé, un comportamento non definito. Risultati del comportamento non definito se quel puntatore di tipo incompatibile è dereferenziato. Il codice nella versione originale della domanda non lo faceva, quindi non mostrava un comportamento indefinito. – Peter
La memoria restituita dalla chiamata di calloc()
viene rilasciata dalla chiamata di free()
.
Nel codice che interessa sia x
e .
Sì, lo fa.
Il metodo è void free(void *ptr)
, quindi quando si crea char* y = x
, si ha un puntatore alla stessa memoria di spazio che stava puntando a .
Ciò consente di liberare lo spazio in seguito con free (y)
.
Tuttavia, si dovrebbe inserire x = NULL
perché ora x
non dispone di uno spazio proprio nonostante abbia un valore.
Per ulteriori informazioni sulla lettura gratuita here.
sì, libera la memoria allocata per x –
[Non eseguire il cast 'malloc()' (o 'calloc()')!] (Http://stackoverflow.com/a/605858/3488231) – ace
@AndreyChernukha, La risposta è [dipende] (http://stackoverflow.com/a/30000348/3049655). (Hai postato quel commento * prima * modifica l'OP) –