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

如何在Python中通过ctypes向C函数传递已声明变量的引用

解决Python调用MATLAB生成的C void函数的参数传递问题

错误原因分析

  • 你将C.POINTER(C.c_float)(ctypes类型)当作实例使用,byref()要求传入ctypes实例而非类型,因此触发第一个错误。
  • 直接传入类型会导致ctypes无法完成参数转换,引发第二个错误。
  • 调用output_var()创建的是未初始化的野指针,C函数写入时会访问无效内存,导致段错误。

正确实现代码

import ctypes as C

# 加载动态链接库
lib = C.CDLL('path/to/lib.so')
func = lib.func

# 显式声明函数参数类型(推荐,避免自动推断出错)
func.argtypes = [C.POINTER(C.c_int), C.POINTER(C.c_float)]

# 创建输入变量实例
input_var = C.c_int(5)
# 创建输出变量实例:分配一块可写入的float内存空间
output_var = C.c_float()

# 调用函数,通过byref传递变量的地址
func(C.byref(input_var), C.byref(output_var))

# 获取输出结果
print(f"输出值:{output_var.value}")

关键说明

  • C.c_float()会创建一个拥有有效内存的float实例,C函数可以直接写入这块内存。
  • C.byref(var)用于传递变量的内存地址,是轻量级的传递方式,适合这类简单输出参数场景;若需操作指针本身,也可使用C.pointer(var),但byref效率更高。
  • 显式设置argtypes能让ctypes严格校验参数类型,避免隐蔽的类型转换错误。

内容的提问来源于stack exchange,提问作者Brian Barry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:30:59