我目前正在内存编辑一款名为 Assault Cube 的游戏。不幸的是,由于动态内存分配,我想要编辑的值的地址在每次游戏启动时都会发生变化。幸运的是,有一些静态指针总是指向动态地址。使用 Cheat Engine ,我可以找到指针,但它们有时会达到 8 个级别。我宁愿做:*pointer
,而不是每次都做********pointer
。最重要的是,它们有偏移量,因此对它们进行硬编码将是一场噩梦。
相反,我正在使用这个函数:
int* getLowestPointer(int** highestPointer, int levels, int offsets[])
{
for (int i = 0; i < levels; i++) {
highestPointer = (int**) (*highestPointer + offsets[i]/sizeof(int)); // I am dividing by sizeof(int) here to undo pointer arithmetic (since the offsets are the difference between the offsetted pointer and the base pointer - not in integer increments)
}
return (int*) highestPointer;
}
但它非常困惑,我将 int* 转换为 int** ,反之亦然,这被认为是不好的做法。我可以做一些不会导致不良实践的事情吗?我还在网上找到了这个:
DWORD FindDmaAddy(int PointerLevel, DWORD Offsets[], DWORD BaseAddress)
{
DWORD Ptr = *(DWORD*)(BaseAddress);
if(Ptr == 0) return NULL;
for(int i = 0; i < PointerLevel; i ++)
{
if(i == PointerLevel-1)
{
Ptr = (DWORD)(Ptr+Offsets[i]);
if(Ptr == 0) return NULL;
return Ptr;
}
else
{
Ptr = *(DWORD*)(Ptr+Offsets[i]);
if(Ptr == 0) return NULL;
}
}
return Ptr;
}
我认为这比我写的还要丑陋。我不建议您阅读它,除非您想偏头痛。
最佳答案
我不确定“最干净的方式”,但除了取消引用这些指针之外,你无能为力。我建议使用 typedefs
只是为了让您的代码更具可读性。
也不必担心将 int *
转换为 int **
。当然,这被认为是“不好的做法”,但如果您知道自己在做什么,那么它可能正是所需要的。你只需要小心。
typedef int *** intPtr3;
typedef int ****** intPtr6;
您还可以使用一些宏来清理语法。这将是一个很好的例子,智能地使用宏来提高可读性和整洁性,并减少出错的机会:
#define DEREF6( PTR ) \
******(PTR)
最后,我经常使用一个很好的宏来在内存中移动指针一定数量的字节:
#define PTR_ADD( PTR, OFFSET ) \
(((char *)(PTR)) + (OFFSET))
关于c - 使用偏移量取消引用多级指针的最简洁方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16256902/