我正在读这个帖子:Typecasting variable with another typedef
type_b *sample_b = (type_b *) ((void *) &sample);
不是(无效*)无关紧要吗? & sample将返回一个类型为:type_a的指针,它可以直接转换为(type_b *)。为什么额外(无效*)?我觉得这是错的,但我对我的C不够自信 - 因此需要额外的验证。
答案 0 :(得分:2)
GCC能够根据以下事实优化代码:它检测到指向不兼容类型的两个指针指向同一个内存位置。使用两个指针访问该值将发出有关别名违规的警告(“打字”)。
有时,如果您在一个演员操作数之间放置(void*)
强制转换,则在转换为其他点类型之前,will silence false positive warnings在您可以合法地执行此类重叠访问的情况下。
答案 1 :(得分:0)
将指针转换为类型void
会隐藏指针编译器的真实类型,因此您可以将其转换为您想要的任何类型,编译器将没有足够的信息来知道它是否有效,因此它允许它。
如果不这样做,编译器会 - 在最低限度 - 抱怨你试图将指针从一种类型转换为另一种不兼容的类型。
重要提示:
您提到的问题的原始海报是试图做一些危险的事情。假设是内存中结构的对齐方式是相同的,允许它们访问两个单独的char,就好像它们是两个字符的单个数组一样。这在理论上可能是正确的,并且可能在一个小的测试程序中起作用,但如果这是在一个生产代码中完成的,它绝对会在凌晨3点泪流满面地咬牙切齿。