You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串二级指针(char**)从C传递到Python并实现修改?

解决C传递char**到Python后无法更新指针的问题

当前代码执行后C端输出(null),核心问题有两个:

  1. Python回调中直接赋值pp = buffer只是修改了函数局部变量,没有改动C传入的二级指针指向的实际内存地址;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:55:18