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
?我们最终需要一个合适的指针类型。
如果您要设置浮点值,为什么要询问memset
? memset
设置普通位模式;它对浮点数不太好。
我假设您的 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 语言结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )