首页 > 解决方案 > 这是否违反了严格的别名规则?

问题描述

受我对最近帖子的评论的启发:C get element on place without parenthesis,我想知道以下代码是否违反了严格的别名规则:

#include <stdio.h>

int main(void)
{
    int num[3] = { 1, 2, 3 };

    printf("num[1] = %d\n", *(int *)((char *)num + sizeof(int)));

    return 0;
}

我知道将类型转换为其他类型的指针取消引用char是违规的,但在这里,原始指针的类型是int *. char *在它被强制转换为then to之后它被取消引用int *

这是否违反了严格的别名规则?

标签: clanguage-lawyerpointer-arithmeticstrict-aliasing

解决方案


引用C11,第§6.5p7章

对象的存储值只能由具有以下类型之一的左值表达式访问:

  1. 与对象的有效类型兼容的类型

引用C11,第§6.5p6章

访问其存储值的对象的有效类型是对象的声明类型,如果有的话....

强调我的

这里所指向的对象的有效类型num确实是int,因此可以使用指向int.


推荐阅读