首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于内存对齐将字节数组转换为int是否安全?

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

Stack Overflow用户
提问于 2015-11-20 09:51:50
回答 1查看 521关注 0票数 2

我最近想把一个4字节数组的内容分配给一个4字节变量,其中包含字节移位和逻辑OR。

我想检查是否将数组直接转换为int*并获得值。我写了一个小测试程序:

代码语言:javascript
复制
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

但是我担心内存对齐和这种方法的安全性:它安全吗?如果不是,是因为编译器规范还是某种未定义的行为?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-20 09:57:54

但是我担心内存对齐和这种方法的安全性:它安全吗?如果不是,是因为编译器规范还是某种未定义的行为?

不,这不安全

代码语言:javascript
复制
out = *((int*)in);

是未定义的行为,它违反C混叠规则,并可能执行非对齐访问。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33823635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档