2011-09-16 15 views
9

Il secondo arg in prototipi per memmove/memcpy/strcpy sono simili: Ad esempio:cosa significa "const void *" in memmove?

void *memmove(void *dest, const void *src, size_t n); //const void* 
char *strcpy(char *dest, const char *src); //const char* 

Ma evidentemente, se destinazione e src sovrapposizione, quindi contenuti src saranno alterate, violando l'const vuoto/char *?

risposta

20

const void* significa che il referend non verrà modificato tramite il puntatore.

Se ci sono altri puntatori non-const sullo stesso oggetto (noto anche come "aliasing"), ovviamente è possibile modificarli tramite questi. Nello scenario che descrivi, quell'altro puntatore è dest.

A proposito, nel caso di strcpy, il comportamento non è definito se le regioni si sovrappongono e in C99 la firma è char *strcpy(char * restrict s1, const char * restrict s2);. Ma per memmove, l'aliasing è OK. Dandogli regioni sovrapposte hai dato il "permesso" di modificare la regione dest, e lo farà.

+0

d'accordo, è vero. – Alcott

+0

vuoi dire, se non riesco a verificare se dest e src si sovrappongono o no, è meglio non usare strcpy, giusto? – Alcott

+1

@Alcott: giusto. Quello che probabilmente vedrai in pratica è che se le tue regioni si sovrappongono con 'dest

4

Significa memmove garantisce non sarà direttamente modificare la memoria puntato da src.

Ovviamente se i due blocchi si sovrappongono a memmove cambierà la cosiddetta memoria "const". const è ca contratto collegato a un nome. Non c'è modo di rendere la memoria reale di sola lettura.

+0

@downvoter Ti interessa un commento? – cnicutar

+0

Valore in difetto inferiore in base alle modifiche. –

+0

@Praetorian Spesso non so di cosa sto parlando, ma mi piacciono i commenti quindi potrei imparare :-) – cnicutar

7

L'argomento è contrassegnato const void * per indicare memmove non modificherà mai la memoria indicata da src utilizzando quel puntatore. Se si verifica una sovrapposizione, la memoria viene modificata utilizzando il puntatore dest, non il puntatore src, quindi la garanzia non viene violata.

3

Come sopra, memove non modificherà il contenuto della memoria tramite il puntatore "src" ma attraverso il puntatore "dest".

Il const si riferisce a come vengono utilizzati i puntatori, non aggiunge alcuna protezione della memoria.

Se entrambi i puntatori indicano una regione di memoria sovrapposta, può accadere qualcosa in quanto non è definita se la copia inizierà da "src" e incrementerà o inizierà da "src + n" e decrementa.

+0

scusate per aver guardato come una risposta ripetuta da Ho postato nello stesso momento in cui sopra è stato modificato –

+0

quel genere di cose succede tutto il tempo, non è un problema. Di solito ci sono sottili differenze nelle risposte anche quando sono sostanzialmente le stesse, e spesso è abbastanza utile avere diverse spiegazioni della stessa cosa: un lettore ne capirà una meglio, qualcun altro ne capirà un'altra. –