【问题标题】:Read and write to pointer function with memcpy c++使用 memcpy c++ 读写指针函数
【发布时间】:2014-01-21 12:15:37
【问题描述】:

您好,今天我正在尝试清理我的代码,但我对指针和 memcpy 有点陌生。 我正在尝试做的是我可以做到的事情。

pos()->x = 500; 甚至 printf(pos->x)

到目前为止的代码 - 只读

struct vec3
{
    float x, y, z;
};

vec3 client::pos()
{
    vec3 vPos;
    memcpy(&vPos, &(*(float *)(state() + 0x1C)), sizeof(vec3));
    return vPos;
}

上述代码将正确返回 Z、Y 和 Z 线,但显然它不是指针,因此无法设置。

我真的不知道如何才能很好地从上述方法中逆转使用,而不是逆转,而是同时使用它,然后为此定义两种方法。

以下是我当前如何设置 pos 的示例

void client::setPos(float x, float y, float z)
{
    vec3 vPos = {
        x==NULL?pos().x:x,
        y==NULL?pos().y:y,
        z==NULL?pos().z:z
    };
    memcpy(&(*(float *)(state() + cordX)), &vPos, sizeof(vec3));
}

如何通过将我的第一个方法作为指针将这两种方法“绑定”为一个?

【问题讨论】:

  • 您为什么不想保留您的代码? (如果 ABI 允许,编译器可能会玩指针技巧)
  • 我不确定你所说的“保留你的代码”是什么意思,我的意思是我不想添加另一种方法来编写它。
  • 为什么在 setPos 函数中检查 x、y 和 z 是否为 NULL?这些不是指针...
  • 因为默认参数等于 NULL。如果未指定该线,则使用当前线设置。不开玩笑,他们并没有指出这篇文章的全部意义在于提出一个多合一的指针。
  • state() + 0x1C 在我看来很可疑。你真的需要这样吗?状态是什么样的?

标签: c++ pointers memcpy


【解决方案1】:

这个怎么样:

vec3* client::pos()
{
    return (vec3*)(state() + 0x1C);
}

这样,pos() 应该返回一个指向内部存储数据的 vec3 指针。然后 pos() 的调用者可以直接修改该数据(如果这确实是您想要的)。

请注意,您要给出指向内部内存的指针,您必须以某种方式处理内存寿命问题(例如,如果 state() 稍后指向不同的内存而有人仍在使用 pos() 的返回值,会发生什么? )。

【讨论】:

  • state() 始终是当前玩家的状态 :) 应该没有问题,尝试一下。看起来简单而有前途。谢谢!
  • client 是一个类数组,现在只是为了仔细检查我应该是安全的,对吧?你有什么推荐吗?我监控玩家离开并进行可变重置。你是说当客户离开时我需要以某种方式杀死那个指针吗?而且效果很好!
  • 只要你像“someclient.pos()->x = 500”一样使用它就可以了。但如果你执行“vec3* thePos = someclient->pos(); delete someclient;”之类的操作,thePos 将指向无效内存。因此,在使用 pos() 时必须非常小心(我不知道有什么方法可以让编译器捕获此类错误)。以我的经验,这使得整个代码更难维护。但老实说,使用这些“state() + 0x1C”语句,您的代码看起来已经很糟糕了,所以 pos() 的东西不会让它变得更糟:-D
  • 哈,谢谢。还没有面对任何问题。非常非常稳定和反应灵敏。所以你的意思是如果我将一个新指针定义为 pos?这不会发生 :) 这就是为什么我首先需要这个。只是为了快速阅读和写作/计算。我会做一些测试,看看情况如何。
  • 这里有两个使用魔法的例子i.imgur.com/eiTrQ5r.png // i.imgur.com/I0QeXM5.png 用于简单的使用,这不会有任何问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 2023-03-24
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多