gcc(6.3.1 20170109)编译以下程序时
#include <stdio.h>
int main(int argc, const char *argv[]) {
unsigned char x[] = {0x66, 0x19};
printf("%i\n", ((short *)((char *)&x[0]))[0]);
return 0;
}
生成警告:
pun.c:在函数'main'中:pun.c:5:5:警告:解除引用类型惩罚指针会破坏严格别名规则[-Wstrict-aliasing]
使用 char
指针时不应该键入别名?
1 回答
这是C11(或者至少是免费的N1570草案)关于别名的说法:
字符类型异常意味着您可以通过
char*
或unsigned char*
访问任何类型,但这并不意味着您可以通过任何类型访问char*
.short*
不符合此处列出的char*
的其他条件,因此此用法是未定义的行为 .另外,如果无条件允许,您可以打破对齐要求: