| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 754 人关注过本帖
标题:union问题
只看楼主 加入收藏
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
回复 7楼 TonyDeng
您的话如当头棒喝。
2011-12-01 10:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这个union数据,char c[6],无论int是16bit还是32bit,它都跨越了两个int的边界,那么c[]的取值,除了受int的真实位数影响之外,还跟int是高头还是低头有关。这种数据类型的使用很雷人,地雷的雷。按照编程规范的指导,联合体的使用应该只用其中一个变量名,避免中途转换,如果非要转,也应该用语言的内置类型专有函数去转,而不能自己想当然用内存影像硬转,因为编译结果或机器现实未必如你所料。

授人以渔,不授人以鱼。
2011-12-01 10:44
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
共用体变量中起作用的成员是最后一次存放的成员,你在程序中只对i[]成员赋值,怎么能输出c[]呢?

A real warrior never quits.
2011-12-01 11:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
主要的问题是你没有对数据初始化,输出的两个??落在未初始化的空间上。

在VS2010 C++中,int是4byte(从而整个结构体是16byte),对i[1]赋值,落在c[4]上,从c[4]开始连续字节是int 0x35的值(35 00 00 00)。你输出的c[1],是未初始化的,在VS2010中,这种未初始化的空间值i[0]=0x003afcac(可能是随机的,调试时和运行时的值不同),这是不可识别的字符编码,故显示??。

程序代码:
#include <stdio.h>
#include <conio.h>

typedef union _myUnion
{
    int i[4];
    long k;
    char c[6];
} myUnion;

void show_UnionMapping(const myUnion *theUnion);

void main(void)
{
    myUnion a = {0};

    printf_s("结构体的尺寸 = %dByte\n", sizeof(a));
    printf_s("\n开始时内存:\n");
    show_UnionMapping(&a);
    a.i[1] = 0x61;
    printf_s("\n赋值后内存:\n");
    show_UnionMapping(&a);
    printf_s("\n输出:c[1]=%c c[%d]=%c\n", a.c[1], sizeof(a.i[0]), a.c[sizeof(a.i[0])]);

     _getch();
}

void show_UnionMapping(const myUnion *theUnion)
{
    char* p = (char *)theUnion;
    for (size_t index = 0; index != sizeof(*theUnion); ++index)
    {
        printf_s("%x ", *p);
        ++p;
    }
    printf_s("\n");
}

稍微修改一下,将i改为short数组,并输出k:



程序代码:
#include <stdio.h>
#include <conio.h>

typedef union _myUnion
{
    short i[4];
    long k;
    char c[6];
} myUnion;

void show_UnionMapping(const myUnion *theUnion);

void main(void)
{
    myUnion a = {0};

    printf_s("结构体的尺寸 = %dByte\n", sizeof(a));
    printf_s("\n开始时内存:\n");
    show_UnionMapping(&a);
    a.i[1] = 0x61;
    printf_s("\n赋值后内存:\n");
    show_UnionMapping(&a);
    printf_s("\n输出:c[1]=%c c[%d]=%c k=%x\n", a.c[1], sizeof(a.i[0]), a.c[sizeof(a.i[0])], a.k);

     _getch();
}

void show_UnionMapping(const myUnion *theUnion)
{
    char* p = (char *)theUnion;
    for (size_t index = 0; index != sizeof(*theUnion); ++index)
    {
        printf_s("%x ", *p);
        ++p;
    }
    printf_s("\n");
}



[ 本帖最后由 TonyDeng 于 2011-12-2 03:49 编辑 ]

授人以渔,不授人以鱼。
2011-12-02 03:16
快速回复:union问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046131 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved