Python ctypes:如何在回调中为C函数分配输出缓冲区

loading...


-1

我有下一个回调作为c代码函数中的一个参数:

typedef unsigned char* (*my_callback)(int size);
//for example:
unsigned char * tmp_buff = nullptr;
tmp_buff = i_alloc_fn(10);
printf("Tmp buff addr = %d.\n", tmp_buff);
*tmp_buff = 111;
printf("I am still alive");

我试图从python提供这个回调(C代码加载为.so lib) . 我试过两种方法 .

ALLOC_CALLBACK_FUNC = ctypes.CFUNCTYPE(ctypes.c_char_p, ctypes.c_int)
#...
def py_alloc_callback(size):
    libc = ctypes.CDLL("libc.so.6") 
    mem_ptr = libc.malloc(ctypes.c_uint(size))
    return mem_ptr

ALLOC_CALLBACK_FUNC = ctypes.CFUNCTYPE(ctypes.c_char_p, ctypes.c_int)
stringbuffer = ''
#...
def py_alloc_callback(size):
    global stringbuffer
    stringbuffer=ctypes.create_string_buffer(size)

    return ctypes.POINTER(ctypes.c_ubyte)(stringbuffer)

但是这两种变体在尝试写入分配的内存时导致C代码中的分段错误 . 请帮帮我解决

loading...

2回答

  • 0

    现在它有效:

    def py_alloc_callback(size):
        libc = ctypes.CDLL("libc.so.6") 
        alloc_f = libc.malloc
        alloc_f.restype = ctypes.c_void_p
        alloc_f.argtypes = [ ctypes.c_uint ] 
        return alloc_f(ctypes.c_uint(size))
    

  • 0
    mem_ptr = libc.malloc(ctypes.c_uint(size))
    

    显然是错的 . malloc 的参数是 size_t 类型 .

评论

暂时没有评论!