2010-09-03 4 views

risposta

5

"Sovrapposizione di memoria" non si verifica da solo. Siete voi che potete fornire la funzione memmove con aree di memoria che si sovrappongono. Prendi due indicatori in nello stesso array e puoi facilmente finire con aree di memoria sovrapposte.

Naturalmente, è anche possibile creare facilmente oggetti sovrapposti attraverso i sindacati.

Non è chiaro cosa intendi con la seconda parte della domanda ("come può questa funzione copiare ancora correttamente il blocco di memoria"). Dove vedi il problema qui?

+0

Non capisco come una funzione gestirà il problema di sovrapposizione della memoria –

+0

Funziona come se la fonte fosse stata copiata in un altro buffer, quindi copiata nella destinazione. Memcpy() copia direttamente l'origine a destinazione. – Jefferson

3
memmove(p+1, p, 42); 

Che richiede lo spostamento dei byte che iniziano alla fine. Memcpy() ne fa un casino.

+0

In senso stretto, 'memcpy' ha un comportamento non definito se utilizzato in questo modo. Potrebbe funzionare, ad esempio, se fosse scritto supponendo che la copia all'indietro sia più veloce, o se "memcpy" fosse appena implementato come chiamata a "memmove", ma non dovresti mai fare affidamento su tali cose. :-) –

+0

perché mai si dovrebbe usare memcpy se conosce memmove;) –

+0

Perché memcpy() è più veloce. –