python - 指向 c_int 的 ctypes 指针与 c_int 数组

标签 python arrays pointers ctypes

我正在尝试调用 dll 中的函数。该函数称为 pop() 并采用两个参数,一个 int 和一个指向 int 的指针。第一个参数是从第二个参数开始的数组的长度。此函数应返回一个指向 int 的指针,该指针是 n-1 元素数组中的第一个元素,其中 n 是原始数组中的元素数。返回的数组应该是原始数组,没有第 0 个元素。

我的代码:

from ctypes import cdll, c_int, POINTER

lib = cdll.LoadLibrary('extlib.dll')

lib.pop.restype = POINTER(c_int)
#lib.pop.restype = c_int*4

testArray = (c_int*5)(*[5,6,7,8,9])
output = list(lib.pop(5, testArray)[0:4])

print output

按原样运行时,它会产生以下(预期)输出:

[6, 7, 8, 9]

如果我取消注释注释行,并注释它上面的行,我会得到这个(意外的)输出:

[6618688, 0, 2, 0]

似乎 c_int*4POINTER(c_int) 类型不同,因为我相信这就是我所做的全部更改。然而,the Python documentation似乎暗示他们应该是一样的。这里发生了什么?具体来说,为什么两个版本的代码执行的不同?

最佳答案

>>> platform.architecture()
('64bit', 'WindowsPE')
>>> ctypes.sizeof(ctypes.c_int*4)
16
>>> ctypes.sizeof(ctypes.POINTER(ctypes.c_int))
8

显然,这些是不同的实体。具体来说,不能从 C 函数返回数组,因为它不适合寄存器。

在第二种情况下,你的结果是你返回的 int* 保存在某处的 ctypes 并解释为 int[4]:第一个是你的指针,在以下地址还有一些垃圾。在 x64 上,第一个是地址的一个 DWORD,下一个是另一个 DWORD(这取决于您的字节序),其余都是垃圾。

关于python - 指向 c_int 的 ctypes 指针与 c_int 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26028544/

相关文章:

python - 如何同时处理在线程之间传递数据(3 个 while True 循环)?

Java:序列化初学者问题:-(

arrays - Fortran 选择排序子例程、错误、数组无法读取

c++ - 为什么在指向对象的指针上调用方法与在对象本身上调用方法具有不同的行为?

c++ - 检索函数调用图

python - 控制 pcolormesh 中的亮度

python - QSTK 中的时间增量

python - 带有行号和列标签的 Pandas Dataframe 2D 选择

.net - 在 vb.net 中对字符串数组进行洗牌

java - 指向结构指针的指针作为 JNA 中的参数