指针位移?
我有以下代码指针位移?
void PacketEncrypt(Packet* packet, int sizeofpacket)
{
int* pointer;
pointer = ((int*)packet+sizeofpacket)-2;
(int)*pointer = packet->PacketSize^0x1A3C;
packet->Type += 0x0FFF7;
}
问题是当我调试它,编译器将其设置为:
0041585E 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
00415861 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
00415864 8D5481 F8 LEA EDX,DWORD PTR DS:[ECX+EAX*4-8]
但我真正想要的是:
0041585E 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
00415861 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
00415864 8D5481 F8 LEA EDX,DWORD PTR DS:[ECX+EAX-2]
我是那种新到C++,所以你可以帮我解决我做错了什么,或者为什么编译器添加标量* 4?谢谢 !
int
指针在您的机器上的大小为4 bytes
,并且只能移动4*n
字节。如果你需要通过2 bytes
将它转换为char
移动指针,因为sizeof(char) = 1
char *ptr = (char*)otherPtr;
ptr += 2; //shift by 2 bytes
int *ptr = (int*)otherPtr;
ptr += 2; //shift by 8 bytes. (2 * sizeof(int))
编辑
(short*)pointer = something.
- 你不能分配给rvalue
。我想你的意思是:
pointer = (char*) something
,或者您需要short
指针:
short *someOtherPointer = something
感谢您的例子和答案! – ffenix 2012-07-24 07:09:38
请确保选中其中一个给出的答案,因为它们都是正确的。如果您需要进一步澄清,留下评论也是有用的。 – defube 2012-07-24 07:18:23
我现在遇到以下问题: char * pointer; pointer =((char *)packet + sizeofpacket)-2; (short *)pointer = packet-> PacketSize^0x1A3C; 它说表达式必须是一个可修改的左值。我想要做的: WORD PTR [pointer] = packet-> PacketSize^0x1A3C 谢谢! – ffenix 2012-07-24 07:27:41
下,用指针类型++做指针运算。 ptr+2
是2 元素,而不是过去ptr
的两个字节。如果,这两个元素是8个字节,并且ptr+2
因此将指向通过ptr
的8个字节。
感谢您的快速回答! – ffenix 2012-07-24 07:09:11
因为'int'在您的系统上的大小为4个字节。 – Mysticial 2012-07-24 07:04:14