我正在尝试调用 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*4
和 POINTER(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/