您可以安全地将具有非const成员的C结构转换为具有const成员的等效结构吗?

时间:2018-09-27 23:26:44

标签: c const

当一个结构具有非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;
}

以上方法是否安全(或在某些情况下安全),或者我可以预料到问题吗?

1 个答案:

答案 0 :(得分:3)

这属于标准未明确涵盖的区域。首先,malloc分配没有类型的内存。

写入动态分配的空间会设置内存的有效类型。但是该标准并未说明nc->value是否“烙印”整个struct nonConst,还是只写了int。同样,它也没有说fprintf(stdout, "%d\n", c->value);是否要求存在整个有效的struct Const,还是只读取const int

这种区别很重要,因为可以写一个int并从相同的内存位置读取一个const int(严格的别名规则专门提到了这一点)。


一些主要的编译器的立场是nc->valuec->value印记/要求整个结构,而不仅仅是涉及的成员。因此,实际上,我认为使用此代码并不安全。

我将在this answer的第二部分中详细介绍该主题。