Podczas próby debugowania problem mam z wykorzystaniem Speex, zauważyłem, że to (no, nie tylko speex, ale niektóre przykładowy kod jak również) wykonuje następujące czynności:Rzuca struct T * na niezdefiniowane zachowanie struct C *, jeśli pierwszym polem T jest C?
- zwracają wskaźnik do EncState ze związku funkcja inicjalizacji
- Obsada że wskaźnik do wskaźnika void
- przechowywać nieważne wskaźnik
- (gdzie indziej)
- Obsada wskaźnik void do wskaźnika do wskaźnika do SpeexMode
- nieprawidłowego wskaźnika
Zdarza się, że definicja EncState zaczyna z polem typu SpeexMode *, a więc wartości całkowitą od wskaźnika do pierwszego pola i wskaźnik do struktury stało się to samo . Dereferencja działa w czasie wykonywania.
Ale ... czy język rzeczywiście pozwala na to? Czy kompilator może robić to, co chce, jeśli to kompiluje? Rzuca struct T * na niezdefiniowane zachowanie struct C *, jeśli pierwszym polem T jest C?
Również duplikat [zgodności wskaźnika strukturalnego] (http://stackoverflow.com/questions/8702713/struct-pointer-compatibility) – netcoder
Jest technicznie UB, tak, ze względu na surową regułę aliasingu. Preferowanym sposobem jest zwykle używanie związku z członkami obu typów. – netcoder