考虑以下代码:
prw------- armali/504 0 2016-09-21 10:21:23 dev/fd/63
这段代码安全吗?也就是说,struct Foo {
float a, b;
};
void bar(float array[2]) {
... // read array[0] and array[1]
}
int main() {
Foo foo;
bar(&foo.a);
}
始终访问bar
和foo.a
?这对我来说似乎不安全,因为填充可能正在发生,但我不知道我们是否可以假设填充为0,因为foo.b
和a
是b
。
答案 0 :(得分:1)
它或多或少是安全的,因为结构中浮动的技术原因没有与数组中的不同。但是这样的代码很难理解:使用相同内存作为不同类型的这些技巧会迫使你多思考并分散代码中的基本内容。而且几乎不需要这样做。所以最好避免这种伎俩。
如果我没弄错,没有官方保证这样的代码可以正常工作,所以如果你想绝对安全并且需要这样的代码,那么你可以添加一个static_assert:
static_assert(offsetof(Foo, b) - offsetof(Foo, a) == sizeof(float));