【发布时间】:2016-07-13 09:41:12
【问题描述】:
问题:
下面的代码是否违反了严格的别名规则?也就是说,是否允许智能编译器打印
00000(或其他一些讨厌的效果),因为首先作为其他类型访问的缓冲区然后通过int*访问?
1234563
如果不是,移除大括号(所以
ptr1和ptr2在同一范围内)会破坏它吗?如果是,如何修复代码?
额外问题:如果代码没问题,并且 2. 或 3. 也不要破坏它,如何更改它以破坏严格的别名规则(例如,将大括号循环转换为使用 int16_t)?
int i;
void *buf = calloc(5, sizeof(int)); // buf initialized to 0
{
char *ptr1 = buf;
for(i = 0; i < 5*sizeof(int); ++i)
ptr1[i] = i;
}
int *ptr2 = buf;
for(i = 0; i < 5; ++i)
printf("%d", ptr2[i]);
寻找关于此特定代码的确认,如此简短(ish),专家回答,理想情况下使用最少的标准引号,是我所追求的。我没有对严格的别名规则进行长时间的解释,只对与此代码相关的部分进行了解释。如果答案能明确列举上面编号的问题,那就太好了。
还假设一个没有整数陷阱值的通用 CPU,假设int 是 32 位和二进制补码。
【问题讨论】:
标签: c language-lawyer strict-aliasing