是否基于内存对齐安全地将字节数组转换为int?

时间:2015-11-20 09:51:51

标签: c arrays

我最近想将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

但我担心记忆校准和这种方法的安全性:它安全吗?如果不是,是由于编译器规范还是某种未定义的行为?

1 个答案:

答案 0 :(得分:7)

  

但我担心记忆校准和这种方法的安全性:它安全吗?如果不是,是由于编译器规范还是某种未定义的行为?

不,这不安全:

out = *((int*)in);

是未定义的行为,它违反了C别名规则,可能会执行未对齐的访问。