我有以下代码
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?谢谢!
答案 0 :(得分:4)
C ++使用指针类型进行指针运算。 ptr+2
是2个元素,而不是ptr
之后的两个字节。如果sizeof(*ptr)==4
,则这两个元素为8个字节,因此ptr+2
将指向8个字节超过ptr
。
答案 1 :(得分:1)
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