nrmj <maa1666@xxxxxxxx> writes: > I have been googling a lot on the web about alias > analysis and strict aliasing, but haven't found much > about what is allowed or not when working with > structures. I don't think these questions have anything to do with gcc. I recommend that you ask on some place like comp.std.c. > 1) If I understand the C standard correctly, the > compiler is free to assume that two pointers pointing > to different types don't alias. > > If two struct have different tag name, like: > struct s1 {int i;}; > struct s2 {int i;}; > struct s1 *p1; > struct s2 *p2; > > p1 and p2 are considered by the compiler to point > to different locations and don't alias, because p1 > points to type "struct s1" and p2 points to type > "struct s2" which are different types, even if they > have the same members, right ? You have to watch out for the exception in C99 6.5.2.3 if there is a visible union declaration which contains both structs. But otherwise, yes, they are different types. > 2) Is it safe to cast pointer to struct B to pointer > to struct A, in order to fake inheritance, like in > this code sniplet ? No, that is not safe. But it is safe to do struct Color_Point { struct Point p; Color color; }; p = &my_color_point.p; > 3) When programming with socket, the following cast to > (struct sockaddr *) is very common. > But is it really safe ? > > struct sockaddr_in my_addr; > ... > bind(sockfd, (struct sockaddr *)&my_addr, > sizeof(struct sockaddr)); That is safe because the code does not dereference the resulting pointer. Ian