如何在不破坏严格别名的情况下将此指针传递到缓冲区?

时间:2015-01-30 18:11:33

标签: c pointers strict-aliasing

我对严格别名的理解是我们不能(像char *这样的少数例外)使用两种不同类型的指针来访问/取消引用相同的内存区域。我有一个char缓冲区和一个指向结构Foo的指针,我想把这个指针“保存”到缓冲区中,以便我在其他地方检索指针并使用它。像这样:

Foo* f =//pointer to some real Foo object
char buf[N];
memcpy(buf, &f, sizeof(Foo*));

然后:

Foo* f2 = *(Foo**) &buf;
f2->bla;

这打破了别名,如下所述,因为buf是一个字符数组,我们将其视为Foo **并取消引用。有没有办法通过指针只通过buf来获取我的Foo对象,或者我是否必须将所有Foo复制到缓冲区中?

1 个答案:

答案 0 :(得分:0)

因为别名规则只允许您通过自己的类型(包括其签名/无符号变体)或字符类型访问对象。

buf是一个字符数组,您通过上面不允许类型列表中的类型访问它。