我最近想将4字节数组的内容分配到4字节变量中,并使用字节移位和逻辑OR。
我想检查是否直接将数组转换为int *并获取值。我写了一个小测试程序:
int main(int argc, char** argv) {
int out = 0;
char in[4] = {0xFF,0xFF,0xFF,0xFF};
char *in2 = NULL;
printf("out = %d\n",out);
out = (int)in[0] << 24 | (int)in[1] << 16 | (int)in[2] << 8 | (int)in[3];
printf("out = %d\n",out);
out = 0;
out = *((int*)in);
printf("out = %d\n",out);
in2 = (char*)malloc(4);
for(int i = 0; i < 4; i++)
in2[i] = 0xFF;
out = 0;
// Byte-Shifting & OR
out = (int)in2[0] << 24 | (int)in2[1] << 16 | (int)in2[2] << 8 | (int)in2[3];
printf("out = %d\n",out);
out = 0;
//Direct assignment by recasting
out = *((int*)in2);
printf("out = %d\n",out);
return 0;
}
预期输出等于-1:
out = 0 out = -1 out = -1 out = -1 out = -1
但我担心记忆校准和这种方法的安全性:它安全吗?如果不是,是由于编译器规范还是某种未定义的行为?
答案 0 :(得分:7)
但我担心记忆校准和这种方法的安全性:它安全吗?如果不是,是由于编译器规范还是某种未定义的行为?
不,这不安全:
out = *((int*)in);
是未定义的行为,它违反了C别名规则,可能会执行未对齐的访问。