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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:31:22