ctypes指向c_int与c_ints数组的指针

时间:2014-09-25 00:18:14

标签: python arrays pointers ctypes

我试图在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*4POINTER(c_int)类型不同,因为我认为这是我改变的全部内容。但是,the Python documentation似乎表明它们应该是相同的。这里发生了什么?具体来说,为什么这两个版本的代码执行相同的操作呢?

1 个答案:

答案 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(这取决于你的字节顺序),其余的都是垃圾。