猿问

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

我将下一个回调作为 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)。我尝试了 2 种方法。


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 代码中的分段错误。请帮我修复它


精慕HU
浏览 245回答 2
2回答

12345678_0001

mem_ptr = libc.malloc(ctypes.c_uint(size))显然是错误的。to 的参数malloc类型为size_t。
随时随地看视频慕课网APP

相关分类

Python
我要回答