由于各种原因,我想更新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属性似乎过于关注实现细节(这甚至会表现得正确吗?)。有没有更惯用的方法呢?
答案 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)
。关键是tmp
与a
共享一个缓冲区(这就是为什么你会找到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
属性(恕我直言)
对于这个无聊的帖子感到抱歉。但我害怕是(唯一?)做指针的方式:)