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 *。
这是否违反了严格的别名规则?
引用C11,章节\xc2\xa76.5p7
\n\n对象的存储值只能由具有以下类型之一的左值表达式访问:
\n\n
\n- 与对象的有效类型兼容的类型
\n
还
\n引用C11,章节\xc2\xa76.5p6
\n\n访问其存储值的对象的有效类型是该对象的声明类型(如果有)......
\n
强调我的
\n这里所指向的对象的有效类型num确实是int,因此可以使用指向的指针来取消引用它int。