我试图在dll中调用函数。该函数名为pop()
,它接受两个参数,一个int和一个指向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似乎表明它们应该是相同的。这里发生了什么?具体来说,为什么这两个版本的代码执行相同的操作呢?
答案 0 :(得分:3)
>>> 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(这取决于你的字节顺序),其余的都是垃圾。