【发布时间】:2020-11-06 10:42:36
【问题描述】:
我有一个共享库,其中的函数接受 int **,如下所示:
void printarray(int **array, int n, int m)
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
printf("%d\n", array[i][j]);
}
我想用ctypes 从 Python 调用函数。为此,我编写了以下内容:
from ctypes import *
cdll.LoadLibrary("libssa.so")
libssa = CDLL("libssa.so")
a = [[1, 2, 3], [4, 5, 6]]
T = ((c_int * 3) * 2)
array = T()
for i in range(2):
for j in range(3):
array[i][j] = a[i][j]
libssa.printarray(array, c_int(3), c_int(2))
我预计T 类型将是指向ints 数组的指针数组,而array 将是指向该类型对象的指针。
但是,只要在 C 代码中访问 array,就会发生分段错误。特别是,对于这个例子,valgrind 指向这条线:printf("%d\n", array[i][j]); 作为段错误的来源。
问题是,构造可用作int ** 类型参数的ctypes 对象的正确方法是什么?
【问题讨论】:
-
“我预计类型 T 将是一个指向整数数组的指针数组,而该数组将是指向该类型对象的指针。”它是,但仅仅因为你有指向整数数组的指针,并不意味着那些指向整数数组的指针实际上有它们指向的整数数组。但无论如何,多维数组的工作方式与 C 中的不同。
标签: python c python-3.x ctypes