鱼C论坛

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

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

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

  1. #include <stdio.h>

  2. union pw
  3. {
  4.     int i;
  5.     char ch[2];
  6. }a;

  7. int main()
  8. {
  9.     a.ch[0] = 13;
  10.     a.ch[1] = 0;
  11.     printf("%d\n",a.i);
  12. }
复制代码
最佳答案
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 ] ...
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-6 23:55:46 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

我知道会覆盖,但是我代码是中的union为4个字节大小,字符型的数组只有两个字节大小,我去读int应该把两个字符都读出来变成130吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 05:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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