【问题标题】:memset pointer + offsetmemset 指针 + 偏移量
【发布时间】:2015-07-08 23:55:14
【问题描述】:

例如,我有:

   DWORD pointer = 0x123456;
   DWORD offset = 0xABC;

我想将offset 添加到指针并将该指针指向的地址处的值设置为1.0f。如何给memset() 一个指针和一个偏移量作为第一个参数?

【问题讨论】:

  • DWORD 不是指针类型,fwiw。但是你会做类似memset(reinterpret_cast<void*>(pointer + offset), ....); 的事情。如果您对pointer 使用实际的指针类型,请确保牢记指针算法。
  • 使用memset 分配1.0f 将是一个有趣的挑战。

标签: c++ pointers memset


【解决方案1】:

DWORD 与 uint32_t 相同。只需像使用任何其他整数一样将它们相加即可。

此外,在设置浮点数时(我假设您正在设置浮点数,因为 '1.0' 之后的 'f'),我不会使用 memset。只需将指针转换为浮点数,然后像这样取消引用它:

DWORD pointer = 0x123456;
DWORD offset = 0xABC;

pointer += offset;

float* float_pointer = reinterpret_cast<float*>(pointer);
*float_pointer = 1.0f;

【讨论】:

    【解决方案2】:

    这可以是简单的指针算术,但我们首先要处理一些初步问题。

    1. 为什么您的pointer 变量声明为DWORD?我们最终需要一个合适的指针类型。
    2. 如果您要设置浮点值,为什么要询问memsetmemset 设置普通位模式;它对浮点数不太好。
    3. 我假设您的 offset 应该以字节为单位,而不是 sizeof(float)

    无论如何,计算你想要的指针可能是这样的:

    float *fp = (float *)(pointer + offset);
    

    [请注意,我在强制转换之前在括号内执行了加法,以获得字节偏移量。如果我改为写(float *)pointer + offset,它会被`sizeof(float)抵消。]

    一旦我们得到那个浮点指针,我们就可以用通常的方式将它指向的位置设置为1.0

    *fp = 1.0f;
    

    或者我们可以使用 memset 将其设置为 0:

    memset(fp, 0, sizeof(float));
    

    【讨论】:

    • all-bits-zero 不保证是float的有效表示
    • @MattMcNabb:不,但我没有说它会设置为0.0,是吗? :-) 无论如何,OP 使用或将使用 all-bits-0 不是 0.0 的机器的可能性大约为 0.0%。
    • 嗯,它可能是一个陷阱表示。但你说得对,非 IEC60559 系统非常罕见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多