我有以下代码
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?谢谢!
发布于 2012-07-24 15:04:08
在您的机器上,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
发布于 2012-07-24 15:04:41
C++使用指针类型进行指针运算。ptr+2
是2个元素,而不是ptr
之后的2个字节。如果为sizeof(*ptr)==4
,则这两个元素是8个字节,因此ptr+2
将指向超过ptr
的8个字节。
https://stackoverflow.com/questions/11625717
复制相似问题