鱼C论坛

 找回密码
 立即注册
查看: 928|回复: 3

[已解决]union共同体内存问题

[复制链接]
发表于 2020-7-6 23:32:48 | 显示全部楼层 |阅读模式
1鱼币
为什么下面这段代码结果a.i为13?
感谢!
#include <stdio.h>

union pw
{
    int i;
    char ch[2];
}a;

int main()
{
    a.ch[0] = 13;
    a.ch[1] = 0;
    printf("%d\n",a.i);
}
最佳答案
2020-7-6 23:32:49
老牛来学习 发表于 2020-7-7 00:29
我知道会覆盖,但是我代码是中的union为4个字节大小,字符型的数组只有两个字节大小,我去读int应该把两 ...

首先一个union为4字节,
所以你的另外两个字符型为了对齐在内存中应该占一个字(只不过高字节都是00)
就比如:存一个int类型的是 00 00 00 0D
而按照两次char类型存入则变成了 00 00 00 0D
所以你读出来是13,而按照两个char读则读出来分别是00 0D

也可以换测试值,比如a.i = 0x0A0B0C0D;
这时候你读两个char稍有不同,会直接读取到0D和0C

但是存两个字符则为了填满4字节会按照两个字来算
如a.ch[0] = 1; a.ch[1 ] =1;
这时候i的值为101H而非101

最佳答案

查看完整内容

首先一个union为4字节, 所以你的另外两个字符型为了对齐在内存中应该占一个字(只不过高字节都是00) 就比如:存一个int类型的是 00 00 00 0D 而按照两次char类型存入则变成了 00 00 00 0D 所以你读出来是13,而按照两个char读则读出来分别是00 0D 也可以换测试值,比如a.i = 0x0A0B0C0D; 这时候你读两个char稍有不同,会直接读取到0D和0C 但是存两个字符则为了填满4字节会按照两个字来算 如a.ch[0] = 1; a.ch[1 ] ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-6 23:32:49 | 显示全部楼层    本楼为最佳答案   
老牛来学习 发表于 2020-7-7 00:29
我知道会覆盖,但是我代码是中的union为4个字节大小,字符型的数组只有两个字节大小,我去读int应该把两 ...

首先一个union为4字节,
所以你的另外两个字符型为了对齐在内存中应该占一个字(只不过高字节都是00)
就比如:存一个int类型的是 00 00 00 0D
而按照两次char类型存入则变成了 00 00 00 0D
所以你读出来是13,而按照两个char读则读出来分别是00 0D

也可以换测试值,比如a.i = 0x0A0B0C0D;
这时候你读两个char稍有不同,会直接读取到0D和0C

但是存两个字符则为了填满4字节会按照两个字来算
如a.ch[0] = 1; a.ch[1 ] =1;
这时候i的值为101H而非101
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-6 23:55:46 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-7 00:29:41 | 显示全部楼层

我知道会覆盖,但是我代码是中的union为4个字节大小,字符型的数组只有两个字节大小,我去读int应该把两个字符都读出来变成130吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 13:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表