memset 指针 + 偏移量

Posted

技术标签:

【中文标题】memset 指针 + 偏移量【英文标题】:memset pointer + offset 【发布时间】: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 将是一个有趣的挑战。 【参考方案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】:

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

    为什么您的pointer 变量声明为DWORD?我们最终需要一个合适的指针类型。 如果您要设置浮点值,为什么要询问memsetmemset 设置普通位模式;它对浮点数不太好。 我假设您的 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 系统非常罕见。

以上是关于memset 指针 + 偏移量的主要内容,如果未能解决你的问题,请参考以下文章

指针偏移量的理解

C 语言结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )

当我将它添加到指针时,我可以安全地忽略溢出检查的最小偏移量是多少?

Python 5月31日

向 IntPtr 添加偏移量

如果 fseek 中的给定偏移量超出最后一个字符会发生啥