我对严格别名的理解是我们不能(像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复制到缓冲区中?
答案 0 :(得分:0)
因为别名规则只允许您通过自己的类型(包括其签名/无符号变体)或字符类型访问对象。
buf
是一个字符数组,您通过上面不允许类型列表中的类型访问它。