2012-03-13 180 views
8

简短版本: 如何获取ctypes指针指向的地址?获取由ctypes指针指向的内存地址

长版本: 我已经注册了一个Python函数作为一个C库的回调。 C库预计函数签名为void (*p_func)(char stat, char * buf, short buf_len),所以我注册了一个合适的python函数。当我进入python函数时,我想知道buf指向的内存地址。我怎样才能做到这一点?

+1

如果您使用{}标签发布了一些源代码,这将有所帮助。谢谢。 – octopusgrabbus 2012-03-13 15:31:08

+1

我已经用'ctypes.addressof(buf.contents)'修复了这个问题,但是我还不能回答我自己的问题。 – 2012-03-13 15:48:40

+0

我认为你正在寻找函数的“id”http://docs.python.org/library/functions.html#id In [1]:a = 4 In [2]:id(a)Out [ 2]:10019764 – 2012-03-13 15:43:41

回答

9

我已经通过阅读文档解决了这个问题。

我想知道一个库分配的内存块的内存位置。我有指向该块的ctypes指针。获取我使用的块的内存地址ctypes.addressof(p_block.contents)

我的理解是p_block.contents != p_block.contents,但后来我意识到所有p_block.contents对象都具有相同的底层缓冲区。底层缓冲区的地址是用ctypes.addressof获得的。

+1

这有点像C中的&(* p)',其中'p'是一个指针。奇怪的是,ctypes没有为'ctypes.POINTER'函数返回的任意指针类型定义'value'属性。 'ctypes.c_void_p'类*具有'value'属性,但'ctypes.POINTER'返回的类不会。非常奇怪的,违反直觉的,几乎是不完整的执行。 – amn 2015-10-22 17:43:03

+1

仅供参考https://bugs.python.org/issue26565“将值属性添加到非基本指针”: >>我知道可以对addressof(p.contents)进行操作,但是c_void_p和c_char_p包含有点不一致值属性中的相同信息。 > c_char_p或c_wchar_p指针的'value'是一个Python字节或str对象。由于'value'不会始终是地址值,因此最好引入只读的as_void属性,该属性可以针对所有指针类型(包括函数指针)一致地实现。 – memeplex 2016-05-24 21:46:35