C函数传递指针和长度,Python回调需要创建一个数组并分配它

时间:2011-03-07 20:19:07

标签: python ctypes

我正在包装一个使用回调作为外部内存分配器的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”的错误。我错过了什么?

1 个答案:

答案 0 :(得分:1)

如果要在参数中返回指针,则需要传入指向指针的指针:

extern int alloc_int_buffer_callback(some_struct **buffer, uint32_t length);

如果你只是传入一个指针,更改函数内部的指针什么都不做,因为你按值传递了指针。

在Python回调中,您可以使用

ptr.contents = cast(arr, POINTER(SomeStruct))

更改原型后。