【发布时间】:2021-06-06 12:33:25
【问题描述】:
假设我们有以下代码:
#include <stdio.h>
#include <stdint.h>
int main()
{
uint16_t a[] = { 1, 2, 3, 4 };
const size_t n = sizeof(a) / sizeof(uint16_t);
for (size_t i = 0; i < n; i++) {
uint16_t *b = (uint16_t *) ((uint8_t *) a + i * sizeof(uint16_t));
printf("%u\n", *b);
}
return 0;
}
显然,将 a 转换为 uint8_t 指针并不违反,所以这个问题是关于将结果指针转换为 uint16_t 指针。据我了解,根据标准,它确实违反了严格的别名规则。但是,从实际的角度来看,我不确定,因为a 和b 的类型是兼容的。唯一的潜在违规是 b 为仅存在于这一个表达式中的 uint8_t 指针起别名。所以在我的理解中,即使它违反了规则,我也会怀疑它是否会导致未定义的行为。可以吗?
请注意,我并不是说这段代码有意义。该问题仅用于有关理解严格别名的教育目的。
【问题讨论】:
标签: c language-lawyer strict-aliasing