老牛来学习 发表于 2020-7-6 23:32:48

union共同体内存问题

为什么下面这段代码结果a.i为13?
感谢!

#include <stdio.h>

union pw
{
    int i;
    char ch;
}a;

int main()
{
    a.ch = 13;
    a.ch = 0;
    printf("%d\n",a.i);
}

CodingCat_k 发表于 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 = 1; a.ch =1;
这时候i的值为101H而非101

Hello. 发表于 2020-7-6 23:55:46

传送门

老牛来学习 发表于 2020-7-7 00:29:41

Hello. 发表于 2020-7-6 23:55
传送门

我知道会覆盖,但是我代码是中的union为4个字节大小,字符型的数组只有两个字节大小,我去读int应该把两个字符都读出来变成130吗?
页: [1]
查看完整版本: union共同体内存问题