获取ctypes指针指向的内存地址

Iai*_*ist 8 python ctypes

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

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

Iai*_*ist 10

我通过阅读文档自行解决了这个问题.

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

围绕着我的理解产生了混乱p_block.contents != p_block.contents,但后来我意识到所有p_block.contents对象都有相同的底层缓冲区.使用获得底层缓冲区的地址ctypes.addressof.

  • 这有点像 C 中的 `&(*p)`,其中 `p` 是一个指针。奇怪的是,ctypes 没有为 `ctypes.POINTER` 函数返回的任意指针类型定义 `value` 属性。`ctypes.c_void_p` 类*确实*具有 `value` 属性,但 `ctypes.POINTER` 返回的类没有。非常奇怪,违反直觉,并且几乎是不完整的实施。 (2认同)
  • 仅供参考 https://bugs.python.org/issue26565,“向非基本指针添加值属性”:>> 我知道可以做 addressof(p.contents),但是 c_void_p 和 c_char_p 包含相同的信息有点不一致在 value 属性中。> c_char_p 或 c_wchar_p 指针的 `value` 是 Python 字节或 str 对象。由于 `value` 不会始终是地址值,因此最好引入一个只读的 `as_void` 属性,该属性可以为所有指针类型(包括函数指针)一致实现。 (2认同)

kxr*_*kxr 7

real_adr = cast(anyctypespointer, c_void_p).value
Run Code Online (Sandbox Code Playgroud)

适用于任何类型的 ctypes 指针 - 甚至是缺少的函数指针等.content