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

mac*_*e_1 5 c strict-aliasing pointer-arithmetic language-lawyer

受到我对最近帖子的评论的启发: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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Aja*_*iya 2

引用C11,章节\xc2\xa76.5p7

\n
\n

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

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

\n

引用C11,章节\xc2\xa76.5p6

\n
\n

访问其存储值的对象的有效类型是该对象的声明类型(如果有)......

\n
\n

强调我的

\n

这里所指向的对象的有效类型num确实是int,因此可以使用指向的指针来取消引用它int

\n