考虑以下 C 代码:
struct base_type
{
// ...
};
struct complex_type
{
struct base_type base_type_part;
int complex_type_part;
};
void function(struct base_type* base_type_ptr)
{
struct complex_type* complex_type_ptr = (struct complex_type*)base_type_ptr;
complex_type_ptr->complex_type_part = 1;
}
int main()
{
struct complex_type complex_type_object;
function((struct base_type*) &complex_type_object);
// ...
}
这种黑客行为合法吗?
我一直在修改标准,尤其是关于别名的部分,我觉得不允许这样做,但每个人都这样做。
如果合法,依据是什么?
这是允许的,并且会按预期工作。指向聚合类型对象的第一个元素的指针始终等于指向对象本身的指针。
在 C++ 中,此属性称为指针互转换。
但是示例中给出的接口非常可疑的事实是另一回事。
将类型重新定义为抽象类型,然后再定义为本机类型不会导致问题。该标准允许并说它将耕作。另一件事,您的逻辑有误。您必须将地址传递给
base_type_part
不进行类型转换,然后进行地址偏移。有时偏移量为零,有人根本不做偏移量,但你不应该依赖它,因为它会导致严重的错误。
标准