使用ctypes访问16位指针

时间:2019-02-04 15:02:20

标签: python python-3.x pointers ctypes

为什么以下各项不起作用?

import ctypes

class Test(ctypes.Structure):
    _fields_ = [("my_pointer", ctypes.POINTER(ctypes.c_int16))]

t = Test()
t.my_pointer = ctypes.addressof(ctypes.c_int16(123))

错误: TypeError: expected LP_c_short instance, got int 有没有办法生成LP_c_short?还是任何16位指针?

编辑

使用byref代替addressof原因: TypeError: expected LP_c_short instance, got CArgObject

以这种方式定义Test结构,因为它看起来像C-DLL中的样子。

2 个答案:

答案 0 :(得分:2)

使用byrefpointer而不是addressof

a = ctypes.c_int16(123)
t.my_pointer(ctypes.byref(a)

尽管名称类似C &运算符addressof,但返回的是int而不是ctypes指针。

  

ctypes.addressof(obj)

     

将内存缓冲区的地址返回为整数。 obj必须是ctypes类型的实例

编辑

这不起作用吗? :

import ctypes

class Test(ctypes.Structure):
    _fields_ = [("my_pointer", ctypes.POINTER(ctypes.c_int16))]

t = Test()

cc = ctypes.c_int16(123)
t.my_pointer = ctypes.pointer(cc)

print t.my_pointer[0]

答案 1 :(得分:1)

我不是ctypes的专家,但是遵循docs,以下对我有用:

import ctypes

PI16 = ctypes.POINTER(ctypes.c_int16)

class Test(ctypes.Structure):
    _fields_ = [
        ("my_pointer", PI16),
    ]

t = Test()
t.my_pointer = PI16(ctypes.c_int16(123))
print(t.my_pointer[0])

否则,您可以这样做:

t.my_pointer = ctypes.pointer(ctypes.c_int32(123))

前者可以让您做一些奇怪的事情,例如:

PI(ctypes.c_int64(123))[0]

即在不同宽度的整数类型之间强制转换,或更糟糕的是...