2013-01-13 12 views
6

Mam wskaźnik do struktury z uniikopiowanie nad danymi z unii w C

więc powiedzmy, że mamy

struct A { 
    union { 
    char **word; 
    struct A *B 
    } u; 
}; 

i mam zmienne xiy typu A *

typedef A* A_t; 
A_t x; 
A_t y; 

byłoby x-> u = y-> U wystarczy skopiować na rzeczy w związku.

+3

Stwierdzenie spowoduje segfault na pewno! –

+0

BTW: 'typedef A * A_t;' jest błędem składni w C. Czy używasz kompilatora C++? BTW2: wskaźniki typu "przyduszko" należy uznać za zły nawyk. – wildplasser

Odpowiedz

4

Nie można po prostu wykluczyć wskaźników, jeśli nie wskazują one niczego ważnego.
Aby być w stanie wykonać x->u musisz upewnić się, że x wskazuje na poprawną pamięć. Kod, który pokazujesz, odznacza niezainicjowany wskaźnik powodujący niezdefiniowane zachowanie i najprawdopodobniej awarię. To samo dotyczy y->u. Dlatego upewnij się, że x i y wskazują poprawną pamięć, zanim je usuniesz.

x->u = y->u 

nie wykona głęboką kopię lecz płytkie kopię.
W zasadzie skończysz z dwoma wskazówkami wskazującymi na tę samą pamięć, co prawdopodobnie nie jest tym, co masz zamiar lub czego potrzebujesz.

Jeśli potrzebujesz głębokiej kopii, powinieneś przydzielić odbiorcy wystarczającą ilość pamięci do przechowywania danych do niej kopiowanych, a następnie użyć memcpy, aby skopiować zawartość unitu źródłowego do niego.

dobre Przeczytaj:
What is the difference between a deep copy and a shallow copy?

+1

Lepiej przydzielić trochę miejsca na x i y, aby wskazywać, najpierw. –

+0

@CarlNorum: Hmm, oczywiście, założyłem, że OP zrobi to. Zawsze, odkąd je podniosłeś, dodam notatkę na ten temat. –