更新ctypes指针到位

时间:2014-04-02 08:54:58

标签: python ctypes

由于各种原因,我想更新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属性似乎过于关注实现细节(这甚至会表现得正确吗?)。有没有更惯用的方法呢?

2 个答案:

答案 0 :(得分:3)

因为eryksun没有发布他的答案,我会在这里添加它自己。这是应该如何做的:

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)。

答案 1 :(得分:0)

指针是一个保存内存地址的变量,因此调用memmove(addressof(a), addressof(b),...)实际上将b所持有的地址复制到a中,因此a现在指向同一地址b指向的内存位置。如果这是你想要的,那你就完成了。

如果你想要的是将a指向的整数的值设置为与b所指向的整数相同的,那么你需要的是将b指向的地址的内存复制到a指向的内存中。像这样......

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

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

在两种情况下都不需要_objects属性(恕我直言)

对于这个无聊的帖子感到抱歉。但我害怕是(唯一?)做指针的方式:)