【发布时间】:2017-05-20 05:36:31
【问题描述】:
现在我知道我可以通过将指向 struct 的指针转换为 struct 的第一个成员的类型来实现继承。
但是,纯粹作为学习经验,我开始想知道是否可以以稍微不同的方式实现继承。
这段代码合法吗?
#include <stdio.h>
#include <stdlib.h>
struct base
{
double some;
char space_for_subclasses[];
};
struct derived
{
double some;
int value;
};
int main(void) {
struct base *b = malloc(sizeof(struct derived));
b->some = 123.456;
struct derived *d = (struct derived*)(b);
d->value = 4;
struct base *bb = (struct base*)(d);
printf("%f\t%f\t%d\n", d->some, bb->some, d->value);
return 0;
}
This code seems to produce desired results ,但我们知道这远不能证明它不是 UB。
我怀疑这样的代码可能是合法的原因是我看不到这里可能出现的任何对齐问题。但当然,这远非知道不会出现此类问题,即使确实没有对齐问题,代码也可能由于任何其他原因仍然是 UB。
- 上面的代码有效吗?
- 如果不是,有什么办法让它有效吗?
-
char space_for_subclasses[];有必要吗? Having removed this line the code still seems to be behaving itself
【问题讨论】:
-
char space_for_subclasses[] 行是一条红鲱鱼;它不会改变基础结构的大小
-
@PaulStelian 也许不是,但这样做可能会使
malloc(sizeof(struct derived))合法化 -
否则代码在某种意义上是有效的,只要你足够小心在所有情况下正确复制真实类型并且永远不会将基数解释为派生。
-
Malloc 也将始终返回对齐的内存
-
请注意
char space_for_subclasses[]不需要与int value具有相同的对齐要求...
标签: c inheritance language-lawyer flexible-array-member pointer-conversion