当一个结构具有非const成员而另一个结构具有const成员时,从一种结构转换为另一种结构(两者具有相同的形状)是否安全?该代码演示了我正在尝试做的事情。
#include <stdio.h>
#include <stdlib.h>
struct nonConst {
int value;
struct nonConst * next;
};
struct Const {
const int value;
struct nonConst * const next;
};
int main (int argc, char ** argv) {
struct nonConst * nc = (struct nonConst*)malloc(sizeof(struct nonConst));
nc->next = NULL;
nc->value = 8888;
struct Const * c = (struct Const*)nc;/*cast the non-const members to const members*/
fprintf(stdout, "%d\n", c->value);
return 0;
}
以上方法是否安全(或在某些情况下安全),或者我可以预料到问题吗?
答案 0 :(得分:3)
这属于标准未明确涵盖的区域。首先,malloc
分配没有类型的内存。
写入动态分配的空间会设置内存的有效类型。但是该标准并未说明nc->value
是否“烙印”整个struct nonConst
,还是只写了int
。同样,它也没有说fprintf(stdout, "%d\n", c->value);
是否要求存在整个有效的struct Const
,还是只读取const int
。
这种区别很重要,因为可以写一个int
并从相同的内存位置读取一个const int
(严格的别名规则专门提到了这一点)。
一些主要的编译器的立场是nc->value
和c->value
印记/要求整个结构,而不仅仅是涉及的成员。因此,实际上,我认为使用此代码并不安全。
我将在this answer的第二部分中详细介绍该主题。