如何将字符串二级指针(char**)从C传递到Python并实现修改?
解决C传递
char**到Python后无法更新指针的问题 当前代码执行后C端输出(null),核心问题有两个:
- Python回调中直接赋值
pp = buffer只是修改了函数局部变量,没有改动C传入的二级指针指向的实际内存地址; ct.create_string_buffer创建的内存由Python管理,函数返回后会被回收,C后续访问会触发未定义行为。
修正后的Python代码
import ctypes as ct # 明确回调参数类型:指向c_char指针的指针 CALLBACK = ct.CFUNCTYPE(None, ct.POINTER(ct.POINTER(ct.c_char))) dll = ct.CDLL('./test') # 正确声明函数参数与返回值类型 dll.set_callback.argtypes = [CALLBACK] dll.set_callback.restype = None dll.call_python_function.argtypes = [ct.POINTER(ct.POINTER(ct.c_char))] dll.call_python_function.restype = None def my_function(pp): # 分配C风格动态内存(避免Python自动回收) buffer = ct.malloc(128) # 将字符串复制到分配的内存(末尾加\0保证C能识别为字符串) ct.memmove(buffer, b"Hello from Python!", len(b"Hello from Python!") + 1) # 修改二级指针指向的内容:让C的char*指向我们分配的内存 pp[0] = ct.cast(buffer, ct.POINTER(ct.c_char)) # 注册回调函数 dll.set_callback(CALLBACK(my_function)) # 测试:创建初始为NULL的char*指针,传递给C函数 p = ct.POINTER(ct.c_char)() dll.call_python_function(ct.byref(p))
说明
- C代码无需修改,编译后运行会输出:
Python response: Hello from Python! - 内存管理注意:
ct.malloc分配的内存不会被Python自动回收,需在C端用完后调用free(*pp);,或在Python中保存buffer引用后续调用ct.free(buffer)释放,避免内存泄漏; - 若需处理Unicode字符串,需先将Python字符串编码为UTF-8字节串再复制到内存。
内容的提问来源于stack exchange,提问作者Albert Shown
相关产品推荐
相关产品推荐

