首页
社区
课程
招聘
[求助]关于C++的问题请高手指点一下
发表于: 2009-9-28 15:29 5803

[求助]关于C++的问题请高手指点一下

2009-9-28 15:29
5803
typedef struct MOUSE_INPUT_DATA {
USHORT UnitId;
USHORT Flags;
union {
ULONG Buttons;
struct {
USHORT ButtonFlags;
USHORT ButtonData;
};
};
ULONG RawButtons;
LONG LastX;
LONG LastY;
ULONG ExtraInformation;
} MOUSE_INPUT_DATA, *PMOUSE_INPUT_DATA;
这个结构中union是什么意思?它在内存里是怎么存放的呢?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
union就是共用体 表示几个变量共用一个内存位置
2009-9-28 16:25
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
在内存中是怎么排放的?或者说是怎么排列的?实在不能理解共用内存这个概念.deviceiocontorl函数传这个结构要怎么执行?是不是要传三次?
2009-9-30 10:22
0
雪    币: 133
活跃值: (113)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
翻一下C语言的书,里面有共用体的解释。
union和struct的区别是使用内存的方式不同。struct中每个成员项占用各自的空间,其长度是成员项之和。union中某一时刻只存在一个成员的数据,其空间长度按成员项中最大的算。
2009-10-1 02:08
0
雪    币: 70
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Union就是共用体啦。  可以查MSDN吗,解释都很清楚。
2009-10-1 11:47
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我查了MSDN还是不理解,内存怎么能共用啊,如果共用的话,当我引用这个结构体时它到底是什么状态?
是:
typedef struct MOUSE_INPUT_DATA {
USHORT UnitId;
USHORT Flags;
union {
ULONG Buttons;
//struct {
//USHORT ButtonFlags;
//USHORT ButtonData;
//};
};
ULONG RawButtons;
LONG LastX;
LONG LastY;
ULONG ExtraInformation;
} MOUSE_INPUT_DATA, *PMOUSE_INPUT_DATA;
还是:
typedef struct MOUSE_INPUT_DATA {
USHORT UnitId;
USHORT Flags;
union {
//ULONG Buttons;
struct {
USHORT ButtonFlags;
USHORT ButtonData;
};
};
ULONG RawButtons;
LONG LastX;
LONG LastY;
ULONG ExtraInformation;
} MOUSE_INPUT_DATA, *PMOUSE_INPUT_DATA;
当我们引用一个变量时,这个变量的内存是定下来的了,应该是引用这一时该的内存值,但是共用体这个概是什么意思呢?当我们引用时他在共用体时的内存是什么?就算共用的内存是动态的,我们读取内存值时只是在读的那一刻起作用,也就是说读的时候共用体内只读了其中一个数据,共用体内的另一部份数据就没有被读到,那部分数据还有什么意义呢?难道引用一个内存共用体时要读多次?那么,每一次所读的内存数据是什么呢?
2009-10-10 09:14
0
雪    币: 107
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
union 是共用体, union 中的成员指向同一块内存。
当我们定义一个union 变量是, union 结构中最大的内存需求为union变量的大小。
当我们使用union时,使用第一个成员名称还是使用第二个成员名称,它们都会访问同一个地址,
只所以定义那么多名称,完全是个人喜好所决定。
认真学一学汇编, 才会真正理解union 的确切含义
2009-10-10 09:50
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
先谢谢了。
    不我理解的是“使用第一个成员名称还是使用第二个成员名称,它们都会访问同一个地址”,同一个内存地址能放两个或多个数据吗?在赋值的时候,当我向第一个成员赋值以后,共用体的内存就是第一个成员的数据,但是当我向第二个共用体成员赋值的时候,如果内存相同,那第一个成员的数据就被覆盖了,如果我要引用第一个成员时那怎么办,难道被覆盖的数据还存在?
2009-10-10 15:42
0
雪    币: 107
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
同一个内存当然只能放一个数据。
当你向第一个成员赋值的时刻,第二个成员也就有了同样的数据,因为它们是同一个内存。
当你向第二个成员赋值的时候,第一个成员数据被覆盖了。因为它们是同一个内存。
如果你要引用第一个成员,知道了本质,你自然可以妥善处理。
在特定的条件下,你完全可以永远不使用第二个成员,使用第二个成员只是为了方便或者其它。
这就是union 的实质。
2009-10-10 16:09
0
雪    币: 197
活跃值: (52)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
union 可以避免分割数据操纵(位操纵)
//下面的内存布局就是 ----------------低地址  byValue[0], byValue[1], byValue[2], bySomeFlag  高地址----------------------
union TEST
{
        struct  
        {
                BYTE byValue[3];   
                BYTE bySomeFlag;
        } off;
        DWORD dwFirstOff;
};

操作:
TEST test;
test.dwFirstOff = 0x12345678;
test.off.bySomeFlag = 0xFF;

可以避免类型转换
union BASE
{
    DWORD dwBase;
    PBYTE pBase;
    PIMAGE_DOS_HEADER pDosHeader;
}

操作:
........................
BASE base.pBase = pBuffer;
if (IMAGE_DOS_SIGNATURRE == base.pDosHeader->e_lfanew)
{
.......................

    DWORD dwVa = dwRva + base.dwBase;
...................................
}
2009-10-11 09:45
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
就看作一块内存取两个名字,就像上面的long和两short只是以不同形式去访问那四个字节的内存
2009-10-11 21:53
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
非常感谢nimda,也感谢其它热心帮我的朋友。
位控制我是理解了,“避免类型转换”还是有点不理解。
还有,deviceiocontorl传这个结构是不是要传三次?我在OD中就发现断下三次,第一次是MOUSE_INPUT_DATA 结构,第二次貌似ULONG Buttons;第三次是LONG LastX;LONG LastY;而且每次的发送缓冲尺寸都是0x10,即16字节,MOUSE_INPUT_DATA这个结构应该不止16字节吧。
2009-10-12 10:01
0
雪    币: 197
活跃值: (52)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
13
typedef struct MOUSE_INPUT_DATA {
USHORT UnitId;                 //2
USHORT Flags;                  //2

union {                             
ULONG Buttons;         //4

struct {
USHORT ButtonFlags; //2
USHORT ButtonData; //2
};                              //这个结构和Buttons一样大,他俩供用同一内存,4字节
                                 //2者在同一时刻只能是Buttons的含义或者struct的含义
};                             //不同时刻有不同含义,这也是union的本意,记得STL源码剖析里管理内存链表那段就
                     //是利用不同时刻链表指针可以有u不同含义而节省4字节的空间
ULONG RawButtons;    //4
LONG LastX;                 //4
LONG LastY;                 //4
ULONG ExtraInformation; //4
} MOUSE_INPUT_DATA, *PMOUSE_INPUT_DATA;

结构共24个字节。。。传16字节? 估计不够吧
2009-10-12 12:30
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
内存中数据有类型这么一说吗?
        共用体我个人理解是为了面向用户的一个概念(仅个人理解),一个共用体就指向一个内存中的数据,至于你要理解成共用体里的哪个成员,那是用户的事情了
2009-10-12 17:48
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
调试下就知道了  指向的是同一内存 只不过是数据的表现形式不同罢了。
2009-10-16 08:46
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
调试下就知道了  指向的是同一内存 只是把数据换种形式表现出来罢了。
2009-10-16 08:48
0
游客
登录 | 注册 方可回帖
返回
//