返回malloc';使用ctypes将数组从C转换为Python

返回malloc';使用ctypes将数组从C转换为Python,python,c,arrays,ctypes,ctype,Python,C,Arrays,Ctypes,Ctype,我希望使用一些返回多个未知大小数组的C代码。因为有多个数组,我想我需要使用传入指针,我不知道如何将其与malloc结合起来,malloc用于设置数组 这是一些具有代表性的C代码: #include <stdint.h> #include <stdio.h> #include <stdlib.h> //gcc -fPIC -shared -o array_test_c.so array_test_c.c void return_array(int * out

我希望使用一些返回多个未知大小数组的C代码。因为有多个数组,我想我需要使用传入指针,我不知道如何将其与malloc结合起来,malloc用于设置数组

这是一些具有代表性的C代码:

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

//gcc -fPIC -shared -o array_test_c.so array_test_c.c

void return_array(int * outdata1v, int * outdata2v) {
    int i;
    int N = 10;
    int * mydatav2, * mydatav3;
    mydatav2 = (int *) malloc(sizeof(int) * N);
    mydatav3 = (int *) malloc(sizeof(int) * N);
    for (i = 0; i<N; i++){
        mydatav2[i] = i;
        mydatav3[i] = i*2;
    }

    //this doesn't work which makes sense
    outdata1v = mydatav2;
    outdata2v = mydatav3;
}

这不起作用,而且我永远无法打印出20个。有什么想法吗?

你需要指向指针的指针:

void return_array(int **outdata1v, int **outdata2v) {
    int i;
    int N = 10;
    int * mydatav2, * mydatav3;
    mydatav2 = (int *) malloc(sizeof(int) * N);
    mydatav3 = (int *) malloc(sizeof(int) * N);
    for (i = 0; i<N; i++){
        mydatav2[i] = i;
        mydatav3[i] = i*2;
    }

    *outdata1v = mydatav2;
    *outdata2v = mydatav3;
}
void返回数组(int**outdata1v,int**outdata2v){
int i;
int N=10;
int*mydatav2,*mydatav3;
mydatav2=(int*)malloc(sizeof(int)*N);
mydatav3=(int*)malloc(sizeof(int)*N);

对于(i=0;itest.c

#include <stdlib.h>

#define N 10

void test(int *size, int **out1, int **out2) {
    int i;
    int *data1, *data2;
    data1 = (int *)malloc(sizeof(int) * N);
    data2 = (int *)malloc(sizeof(int) * N);
    for (i = 0; i < N; i++){
        data1[i] = i;
        data2[i] = i * 2;
    }
    *size = N;
    *out1 = data1;
    *out2 = data2;
}

编辑:您应该考虑提供一个函数来释放MalOC数据。然后您可以这样做,例如“代码> DLL。清除(DATA1,DATA2)。

您可以发布错误或您得到的任何输出吗?您的意思是,就像在返回多个数组中一样?您不能只返回
int**
?另外,作为一种旁白,返回一个指向数据的指针,您实际上不需要抛出:
(int*)
当前没有错误,只是输出不正确(一些随机数),在我的例子中,
CDLL('test.so'))
不起作用,但
CDLL('./test.so')
起作用了。为什么会这样?Python
释放
malloc
ed内存吗?
#include <stdlib.h>

#define N 10

void test(int *size, int **out1, int **out2) {
    int i;
    int *data1, *data2;
    data1 = (int *)malloc(sizeof(int) * N);
    data2 = (int *)malloc(sizeof(int) * N);
    for (i = 0; i < N; i++){
        data1[i] = i;
        data2[i] = i * 2;
    }
    *size = N;
    *out1 = data1;
    *out2 = data2;
}
from ctypes import CDLL, POINTER, c_int, byref

dll = CDLL('test.so')

data1 = POINTER(c_int)()
data2 = POINTER(c_int)()
size = c_int()

dll.test(byref(size), byref(data1), byref(data2))

for i in range(size.value):
    print i, data1[i], data2[i]