Il ciclo while
sta valutando l'espressione: *p2++ = *p1++
. L'espressione del ciclo while
:
*p2 = *p1
viene valutata utilizzando il risultato di *p1
. Tuttavia, questo valore è ancora assegnato a *p2
anche se l'espressione viene valutata come false
o (0)
. Riscrittura questo:
char c;
do
{
c = *p1; /* read the src byte */
*p2 = c; /* write to dst byte */
p2++, p1++; /* increment src, dst pointers */
}
while (c != 0);
si noterà che una lettura/scrittura avverrà almeno una volta. Va bene, purché la stringa C p1
non sia terminata e p2
disponga di spazio sufficiente per la stringa C. Cioè, malloc
dovrebbe allocare almeno strlen(p1) + 1
byte. In questo codice fornito, questo è vero.
Come altri hanno sottolineato, l'iterazione finale lascerà p1
ad un indirizzo uno past the end, che è ancora un puntatore valido, ma è indefinito risultati quando dereferenziati. L'indirizzo di p2
è sia un puntatore valido, sia un dereferenziamento valido, dal momento che stai allocando 20 byte. Tuttavia, p2
non punta più alla copia della stringa C.Ciò che si vuole è un equivalente a:
char *p1 = "Hello";
char *p2, *tmp;
p2 = (char*)malloc (20);
memset (p2, 0, 20);
tmp = p2;
while (*tmp++ = *p1++);
printf ("%s\n", p2);
maggior parte dei sistemi operativi rilascerà la memoria a p2
all'uscita dal main
, ma è buona pratica per rilassarsi le risorse con una corrispondente chiamata a:
free(p2);
alla fine. In merito alle buone pratiche, dovresti anche controllare il valore di ritorno di malloc
per assicurarti che l'assegnazione abbia avuto successo.
fonte
2013-05-16 08:12:55
[Come funziona "while (* s ++ = * t ++)"?) (Http://stackoverflow.com/q/810129/4279) – jfs