我正在包装一个使用回调作为外部内存分配器的C库。基本上,它不是执行malloc和free本身,而是公开了几个回调来制作指定大小的缓冲区。使用ctypes挂起它们相当容易,所有这些似乎都在起作用。但是,我似乎无法将数组连接到传入的指针。
C接口看起来像这样:
extern int (*alloc_int_buffer_callback)(some_struct* buffer, uint32_t length);
我已经通过ctypes定义了结构,它似乎完美匹配。
ctypes回调看起来像这样:
_int_functype = CFUNCTYPE(c_int, POINTER(some_struct), c_uint)
我遇到的问题是尝试让POINTER(some_struct)实例指向一个类型(c_int * length)的数组似乎不起作用。这是我现在收到的回调:
def _alloc_struct_buffer(ptr, length):
arr_type = SomeStruct * length
arr = arr_type()
ptr.contents = cast(addressof(arr), POINTER(SomeStruct))
return 1
不幸的是,我遇到了“Expected SomeStruct而不是LP_SomeStruct”的错误。我错过了什么?
答案 0 :(得分:1)
如果要在参数中返回指针,则需要传入指向指针的指针:
extern int alloc_int_buffer_callback(some_struct **buffer, uint32_t length);
如果你只是传入一个指针,更改函数内部的指针什么都不做,因为你按值传递了指针。
在Python回调中,您可以使用
ptr.contents = cast(arr, POINTER(SomeStruct))
更改原型后。