从const到非const的转储堆存储是否会调用未定义的行为?

时间:2018-05-03 16:03:48

标签: c malloc const language-lawyer undefined-behavior

标准说:

  

(6.7.3)如果尝试修改对象   通过使用左值使用const限定类型定义   非const限定类型,行为未定义。

在未定义的行为部分:

  

尝试修改使用的对象   通过使用左值的const限定类型   非const限定类型(6.7.3)

malloc 的返回值是未初始化存储空间的块。在该存储中没有构建对象

那就是说下面的代码是合法的吗?

#include
#include

typedef struct {
    unsigned char h;
    const unsigned int v;
} liber_primus;

int main(int argc, const char **argv)
{
    unsigned int lykilord;

    if (!(argc - 1))
        return 0;

    liber_primus *runaljod = malloc(sizeof (*runaljod));

    if (!runaljod)
        abort();

    runaljod->h = *(unsigned char *)argv[1];
    *(unsigned int *)&runaljod->v = 3307U;

    lykilord = runaljod->h * runaljod->v;

    free(runaljod);

    return lykilord;
}

0 个答案:

没有答案