C函数传递指针和长度,Python回调需要创建数组并赋值
我正在封装一个C语言库,这个库使用回调函数来管理外部内存分配。简单来说,它不是自己去做内存分配(也就是malloc和free),而是提供了几个回调函数,让你可以根据需要的大小来创建缓冲区。把这些回调函数和ctypes连接起来其实挺简单的,整体看起来都能正常工作。不过,我就是无法把数组和传入的指针连接起来。
C语言的接口大概是这样的:
extern int (*alloc_int_buffer_callback)(some_struct* buffer, uint32_t length);
我已经通过ctypes定义好了结构体,感觉和C语言中的定义完全一致。
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
不幸的是,我收到的错误信息是“期望是SomeStruct,而不是LP_SomeStruct”。我缺少了什么呢?
1 个回答
1
如果你想在一个参数中返回一个指针,你需要传入一个指向指针的指针:
extern int alloc_int_buffer_callback(some_struct **buffer, uint32_t length);
如果你只是传入一个指针,在函数内部修改这个指针是没有用的,因为你是按值传递的指针。
在你的Python回调函数中,你可以使用
ptr.contents = cast(arr, POINTER(SomeStruct))
在改变了函数原型之后。