能力值:
( LV2,RANK:10 )
2 楼
union就是共用体 表示几个变量共用一个内存位置
能力值:
( LV2,RANK:10 )
3 楼
在内存中是怎么排放的?或者说是怎么排列的?实在不能理解共用内存这个概念.deviceiocontorl函数传这个结构要怎么执行?是不是要传三次?
能力值:
( LV5,RANK:60 )
4 楼
翻一下C语言的书,里面有共用体的解释。
union和struct的区别是使用内存的方式不同。struct中每个成员项占用各自的空间,其长度是成员项之和。union中某一时刻只存在一个成员的数据,其空间长度按成员项中最大的算。
能力值:
( LV2,RANK:10 )
5 楼
Union就是共用体啦。 可以查MSDN吗,解释都很清楚。
能力值:
( 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;
当我们引用一个变量时,这个变量的内存是定下来的了,应该是引用这一时该的内存值,但是共用体这个概是什么意思呢?当我们引用时他在共用体时的内存是什么?就算共用的内存是动态的,我们读取内存值时只是在读的那一刻起作用,也就是说读的时候共用体内只读了其中一个数据,共用体内的另一部份数据就没有被读到,那部分数据还有什么意义呢?难道引用一个内存共用体时要读多次?那么,每一次所读的内存数据是什么呢?
能力值:
( LV8,RANK:130 )
7 楼
union 是共用体, union 中的成员指向同一块内存。
当我们定义一个union 变量是, union 结构中最大的内存需求为union变量的大小。
当我们使用union时,使用第一个成员名称还是使用第二个成员名称,它们都会访问同一个地址,
只所以定义那么多名称,完全是个人喜好所决定。
认真学一学汇编, 才会真正理解union 的确切含义
能力值:
( LV2,RANK:10 )
8 楼
先谢谢了。
不我理解的是“使用第一个成员名称还是使用第二个成员名称,它们都会访问同一个地址”,同一个内存地址能放两个或多个数据吗?在赋值的时候,当我向第一个成员赋值以后,共用体的内存就是第一个成员的数据,但是当我向第二个共用体成员赋值的时候,如果内存相同,那第一个成员的数据就被覆盖了,如果我要引用第一个成员时那怎么办,难道被覆盖的数据还存在?
能力值:
( LV8,RANK:130 )
9 楼
同一个内存当然只能放一个数据。
当你向第一个成员赋值的时刻,第二个成员也就有了同样的数据,因为它们是同一个内存。
当你向第二个成员赋值的时候,第一个成员数据被覆盖了。因为它们是同一个内存。
如果你要引用第一个成员,知道了本质,你自然可以妥善处理。
在特定的条件下,你完全可以永远不使用第二个成员,使用第二个成员只是为了方便或者其它。
这就是union 的实质。
能力值:
( 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;
...................................
}
能力值:
( LV2,RANK:10 )
11 楼
就看作一块内存取两个名字,就像上面的long和两short只是以不同形式去访问那四个字节的内存
能力值:
( LV2,RANK:10 )
12 楼
非常感谢nimda,也感谢其它热心帮我的朋友。
位控制我是理解了,“避免类型转换”还是有点不理解。
还有,deviceiocontorl传这个结构是不是要传三次?我在OD中就发现断下三次,第一次是MOUSE_INPUT_DATA 结构,第二次貌似ULONG Buttons;第三次是LONG LastX;LONG LastY;而且每次的发送缓冲尺寸都是0x10,即16字节,MOUSE_INPUT_DATA这个结构应该不止16字节吧。
能力值:
( 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字节? 估计不够吧
能力值:
( LV5,RANK:60 )
14 楼
内存中数据有类型这么一说吗?
共用体我个人理解是为了面向用户的一个概念(仅个人理解),一个共用体就指向一个内存中的数据,至于你要理解成共用体里的哪个成员,那是用户的事情了
能力值:
( LV4,RANK:50 )
15 楼
调试下就知道了 指向的是同一内存 只不过是数据的表现形式不同罢了。
能力值:
( LV4,RANK:50 )
16 楼
调试下就知道了 指向的是同一内存 只是把数据换种形式表现出来罢了。