Myślałem, że w gcc, void * i char * są traktowane w ten sam sposób, jeśli chodzi o arytmetyki wskaźników, tj void * „punkty” do pojedynczego bajtu w pamięci, więc następujący kodC void wskaźnik arytmetyka
void *p;
p = malloc(sizeof(void));
printf("%p %p\n",p,p+1);
rzeczywiście zwraca 0x984a008 0x984a009
. Podobnie pustych ** wskazuje wskaźnik tak Przyrost jedna rzeczywiście oznacza przyrost o 4 bajty (32 bitów na systemie operacyjnym), to
void **p;
p = (void **) malloc(sizeof(void *));
printf("%p %p\n",p,p+1);
powraca 0x984a008 0x984a00c
. Jednak poniższy kod myli mi
void **p, *p1;
p = (void **) malloc(sizeof(void *));
p1 = (void **) p;
printf("%p %p\n",p1,p1+1);
Ponieważ powraca ponownie 0x984a008 0x984a009
. Co tu się dzieje?
Może chodziło o wpisanie 'void ** p ** p1; zamiast' z 'void ** p, * p1;'? –
'sizeof (void)' jest 1 lub przynajmniej daje ostrzeżenie, jest bezużyteczne. Nie rób tego. Co oznacza typ "void"? jest tylko "void *". –
Mam na myśli void ** p, * p1. Wiem, że ten kod kompiluje, nie rozumiem, dlaczego jeśli p jest początkowo deklarowane jako nieważne **, p + 1 odpowiada inkrementowi o 4 bajty, podczas gdy p1 jest uznawane za nieważne *, a później przekształcone jako puste **, arytmetyka dodaje tylko 1 bajt dla p1 + 1 – Ivan