查看: 1945|回复: 2

[其他] 每天解决一个问题33:共同体数组赋值错乱的问题

[复制链接]
  • TA的每日心情
    擦汗
    2022-3-3 09:56
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    106

    主题

    836

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    1527
    最后登录
    2023-6-12
    发表于 2015-9-26 10:21:04 | 显示全部楼层 |阅读模式
    背景
    定义了两个一样的共同体,共同体内还有几个结构体,共同体中最后有一个数组,将所有的数据包括在内,将来赋值好赋。但是赋值后,总是有很多数据跨越了两个共同体。
    解决
    赋值用的是forfor的循环次数原来是个计算出来的值,现在改成常数,还是不对。
    查看Memory中的数据,的确是跨越了。
    1. typedef uion{
    2.        struct {
    3.               int aa;
    4.               int bb;
    5.               int cc[3];
    6.        } dd;
    7.        int e_buf[5];
    8.        int f_buf[8];
    9.        int g_buf[9];
    10.        int all_buf[22];//正确为27
    11. }hh;
    12. hh ii,jj;
    复制代码

    发现每次共同体jj的数据总是赋给共同体ii的最后5个数据,将共同体iijj的存储位置互换后,又是共同体ii的数据赋值给了共同体jj的最后5个。
    iijj在这个工程中正好存储地址是紧挨着的,所以才有这样的问题,要是不挨着,则会产生随机数,问题更难发现了。
    重新计算共同体的占用空间,发现共同体最后的那个总的数组少计算了5个字节,更改后,赋值正确了。
    延伸
    共同体与结构体在处理数据的时候的确很方便,但是要是用的不当,就会出这些问题。
    在使用的时候,尤其是有共同体的时候,最好用sizeof函数先调试一下,看看跟你计算的一不一样。
    我知道答案 目前已有2人回答
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5788
    最后登录
    2025-5-7
    发表于 2015-9-26 20:59:37 | 显示全部楼层
    支持
        154120hhw0q0e0hpw374yw.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-9-26 22:52:17 | 显示全部楼层
    谢谢分享
    freescaleic.org.png
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-13 15:25 , Processed in 0.097546 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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