在p中更新ctypes指针

2024-09-28 22:25:22 发布

您现在位置:Python中文网/ 问答频道 /正文

出于各种原因,我想更新ctypes指针的值。换句话说,我想要的是修改指针对象包装的内部缓冲区。以下是一种可能的方法:

from ctypes import *

a = pointer(c_int(123))
b = pointer(c_int(456))

memmove(addressof(a), addressof(b), sizeof(c_void_p))
a._objects.clear()
a._objects.update(b._objects)

现在a.contents将返回c_long(456)。然而,玩弄objects属性似乎过于关注实现细节(这甚至会正常工作吗?)。有没有更惯用的方法来做这个?在


Tags: 对象方法fromimportobjects原因ctypesint
2条回答

既然艾尔克森还没把答案贴出来,我就自己把它加在这里。应该这样做:

from ctypes import *

a = pointer(c_int(123))
b = pointer(c_int(456))

tmp = pointer(a)[0]
tmp.contents = b.contents

现在a.contents = c_int(456)。关键在于tmpa共享一个缓冲区(这就是为什么您会找到tmp._b_needsfree_ == 0)。在

指针是一个保存内存地址的变量,因此调用memmove(addressof(a), addressof(b),...)实际上将b保存的地址复制到a所以a现在指向{}指向的同一内存位置。如果你想要,那是什么。在

如果要将a指向的整数的值设置为与b所指整数相同的,则需要将b指向的地址处的内存内容复制到a指向的内存中。像这样。。。在

memmove(cast(a, c_void_p).value, cast(b, c_void_p).value, sizeof(c_int))

现在,指针a指向一个内存地址,该地址保存的值与b指向的内存中存储的值类似。在

在这两种情况下,_objects属性不是必需的(IMHO)

很抱歉这个无聊的帖子。但我恐怕是(唯一的?)指针操作方法:)

相关问题 更多 >