Originariamente inviato da YuYevon
Dopo l'allocazione dinamica, il puntatore m avrà un certo valore, diciamo 0x1234. Viene dunque decrementato di 1, il che significa che il suo valore viene decrementato di tanti byte quanti sono quelli che costituiscono il tipo di dato a cui il puntatore punta: se m è un puntatore a int e un int è su 4 byte, il valore di m una volta decrementato sarà 0x1230.
A quel punto nei due for successivi utilizzi gli indici a partire da 1 fino a 10 (anziché 0-9) perché scrivendo m[1] di fatto stai accedendo alla locazione di memoria successiva a quella dell'indirizzo base, ma visto che questo era stato decrementato di una posizione allora stai accedendo proprio alla prima componente dell'array allocato, utilizzando però l'indice 1 anziché 0 come sarebbe normalmente.
Prova a stampare un po' i valori degli indirizzi per renderti conto di tutto questo.
Quello che mi chiedo è come possa non darti un errore runtime l'istruzione free(m) visto che m, essendo stato decrementato, non è il valore originario dell'indirizzo al partire dal quale è stata allocata la memoria... dovresti sostituire quell'istruzione con free(m+1); o simili.

perchè l'istruzione corretta è free (m+1)



ero convinto che con m-- decrementassi di 1 "componente" nel vettore , invece si tratta di byte ..
aritmetica dei puntatori..

scusa ma in questo modo

dire m-- ed m[0]-- è la stessa identica cosa no?
il puntatore m punta ad un area di memoria consecutiva di 10 "int" e il primo elemento è m[0] ;
ponendo m-- dovrebbe puntare a "qualcosa" prima dell elemento m [0] no?

grazie!