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

如何将Python数组传入C函数并获取返回数组并打印?

Python调用C卷积函数:数组传递与返回值处理

问题场景

编写了C卷积函数并编译为convolution.so,但Python调用时无法传入数组,且不知道如何处理返回的数组指针。原Python代码调用时报错:

ctypes.ArgumentError: argument 1: <class 'TypeError'>: Don't know how to convert parameter 1

一、将Python数组传入C函数

ctypes无法直接将Python列表转换为C的数组指针,需要显式转换为C兼容的数组类型,并为C函数声明参数类型:

修改后的Python参数处理代码

from ctypes import *

so_file = "./convolution.so"
convolution_lib = CDLL(so_file)

# 声明C函数的参数类型:两个int指针、一个int
convolution_lib.convolution.argtypes = [POINTER(c_int), POINTER(c_int), c_int]
# 声明返回类型:int指针
convolution_lib.convolution.restype = POINTER(c_int)

a = [1, 3, 5, 6]
b = [3, 5, 6, 7]
input_size = 4

# 将Python列表转为C风格int数组
c_a = (c_int * input_size)(*a)
c_b = (c_int * input_size)(*b)

关键说明

  • (c_int * input_size)(*a)会创建与C语言int[]兼容的数组对象,内存布局和C数组完全一致
  • 通过argtypes和restype声明函数类型,让ctypes自动处理类型转换,避免参数不匹配错误

二、处理返回的数组指针并打印

先修复C函数的致命问题

原C函数返回了栈上的局部数组resArr,函数返回后栈内存会被系统回收,返回的指针是野指针,访问会导致崩溃、乱码等未定义行为。必须改用堆内存分配(malloc):

修改后的C函数

#include <stdio.h>
#include <stdlib.h> // 引入malloc/free的头文件

int * convolution(int a[], int b[], int inputArraySize)
{
    int resArrayLength = inputArraySize*2-1;
    // 在堆上分配内存,函数返回后不会被释放
    int *resArr = (int *)malloc(resArrayLength * sizeof(int));
    if (resArr == NULL) {
        return NULL; // 处理内存分配失败的情况
    }

    // 原有的卷积计算逻辑保持不变...

    return resArr;
}

Python中访问返回数组并打印

拿到返回指针后,根据结果数组长度(input_size*2-1)遍历指针指向的内存,最后必须释放C端分配的堆内存避免泄漏:

完整Python调用代码

from ctypes import *

so_file = "./convolution.so"
convolution_lib = CDLL(so_file)

# 声明函数类型
convolution_lib.convolution.argtypes = [POINTER(c_int), POINTER(c_int), c_int]
convolution_lib.convolution.restype = POINTER(c_int)

a = [1, 3, 5, 6]
b = [3, 5, 6, 7]
input_size = 4

# 转换数组类型
c_a = (c_int * input_size)(*a)
c_b = (c_int * input_size)(*b)

# 调用C函数
result_ptr = convolution_lib.convolution(c_a, c_b, input_size)
result_length = input_size * 2 - 1

# 打印结果数组
print("卷积结果:")
for i in range(result_length):
    print(result_ptr[i], end=" ")
print()

# 释放C端分配的堆内存
free_func = convolution_lib.free
free_func.argtypes = [c_void_p]
free_func(result_ptr)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:46:27