如何在Python中访问被C void函数修改的ctypes数组指针results?
如何在Python中访问C void函数修改的results数组内容?
你当前通过ctypes调用C语言的get_results函数,该函数为void类型,不会返回值,但会直接修改传入的results数组内存。以下是具体的解决方法:
核心原理
你用np.zeros(5)创建的numpy数组,其内存是直接可被C语言操作的。当你通过.ctypes.data_as()把它转成指针传给C函数时,C函数修改的就是这个numpy数组的底层内存空间。因此不需要通过指针变量results访问,直接用最初创建的numpy数组即可获取修改后的数据。
修正后的完整代码示例
首先注意你原Python代码里的一个小错误:你给lib.eq.argtypes赋值,但实际调用的是lib.get_results,需要把参数类型设置给正确的函数:
Python代码
import ctypes import numpy as np # 加载C库 lib = ctypes.cdll.LoadLibrary("./array.so") # 正确设置get_results的参数类型(原代码错设给了lib.eq) lib.get_results.argtypes = ( ctypes.c_int, ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_float) ) # 假设parameters是已有的numpy数组 parameters = np.array([1.0, 2.0, 3.0], dtype=np.float32) params = parameters.ctypes.data_as(ctypes.POINTER(ctypes.c_float)) # 创建numpy数组用于接收结果,建议用不同变量名区分指针 results_np = np.zeros(5, dtype=np.float32) results_ptr = results_np.ctypes.data_as(ctypes.POINTER(ctypes.c_float)) # 调用C函数 lib.get_results(ctypes.c_int(5), params, results_ptr) # 直接访问numpy数组即可获取修改后的结果 print(results_np)
对应的C代码(保持你的逻辑即可)
void get_results(int size, float params[], float results[5]) { // 示例计算逻辑 results[0] = params[0] * 2; results[1] = params[1] + 3; results[2] = params[2] - 1; results[3] = params[0] + params[1]; results[4] = params[1] * params[2]; }
额外说明(不用numpy的情况)
如果不用numpy,也可以用ctypes原生数组:
# 创建ctypes数组 results_ctypes = (ctypes.c_float * 5)() # 直接传入数组(ctypes会自动转成指针) lib.get_results(ctypes.c_int(5), params, results_ctypes) # 访问数组内容 print([x for x in results_ctypes])
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

