Durante la lettura di memmove ho letto che è in grado di gestire SOVRAPPOSIZIONI DI MEMORIA ma non riesco a capire come può verificarsi una sovrapposizione di meme tra due stringhe e come questa funzione può ancora copiare correttamente il blocco di memoria.Come si verifica la sovrapposizione della memoria e come viene controllata?
risposta
"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?
memmove(p+1, p, 42);
Che richiede lo spostamento dei byte che iniziano alla fine. Memcpy() ne fa un casino.
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. :-) –
perché mai si dovrebbe usare memcpy se conosce memmove;) –
Perché memcpy() è più veloce. –
Non capisco come una funzione gestirà il problema di sovrapposizione della memoria –
Funziona come se la fonte fosse stata copiata in un altro buffer, quindi copiata nella destinazione. Memcpy() copia direttamente l'origine a destinazione. – Jefferson