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

时间:2019-12-18 22:03:25

标签: c language-lawyer pointer-arithmetic strict-aliasing

受到我对最近帖子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 *然后转换为int *后,将取消引用。

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

2 个答案:

答案 0 :(得分:2)

引用C11,第§6.5p7

  

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

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

引用C11,第§6.5p6

  

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

重点矿区

这里num所指向的对象的有效类型的确是int,因此可以用指向int的指针对其进行取消引用。

答案 1 :(得分:1)

这不会不会破坏严格的别名。

num强制转换为char *并对其执行算术后,结果指针将强制转换为int *,并且该指针指向有效的int对象。因此可以安全地取消引用。