转换为非标量类型

时间:2016-10-11 23:00:36

标签: c pointers struct

我有2个相同大小,布局和对齐的结构,但是有不同的类型。我想把一个复制到另一个。

struct one s1;
struct two s2;

...

s1 = (struct one)s2;  // error: conversion to non-scalar type requested
s1 = *((struct one*)&s2);  // fine?

第二种方法是安全的吗?便携式?

奖金:这里语言设计师的想法是什么,他们确保在我开始自拍之前取消安全措施吗?

1 个答案:

答案 0 :(得分:2)

由于违反严格别名规则,第二种方法是未定义的行为。即使struct onestruct two具有相同的布局,也不允许使用类型struct one的左值来访问类型为struct two的对象,反之亦然。

通常,只允许使用字符类型访问另一个对象,通过不同类型的表达式访问对象;或通过工会。

另一种选择是:

memcpy(&s1, &s2, sizeof s1);