使用Python ctypes访问C结构体数组

4

我有一个在C代码内分配内存并且通过Python访问的C函数。指针内容在C代码中包含结构体数组,但是我无法使ctypes在0号元素以外正确地访问该数组。我该如何得到正确的内存偏移量来访问非零元素?如果尝试使用Python的ctypes.memset函数,则会出现类型错误。

typedef struct td_Group
{
    unsigned int group_id;
    char groupname[256];
    char date_created[32];
    char date_modified[32];
    unsigned int user_modified;
    unsigned int user_created;
} Group;

int getGroups(LIBmanager * handler, Group ** unallocatedPointer);

############# python code below: 
class Group(Structure):
    _fields_ = [("group_id", c_uint),
                ("groupname", c_char*256),
                ("date_created", c_char*32),
                ("date_modified", c_char*32),
                ("user_modified", c_uint),
                ("user_created", c_uint)]


myGroups = c_void_p()
count = libnativetest.getGroups( nativePointer, byref(myGroups) )
casted = cast( myGroups, POINTER(Group*count) )
for x in range(0,count):
    theGroup = cast( casted[x], POINTER(Group) )
    # this only works for the first entry in the array:
    print "~~~~~~~~~~" + theGroup.contents.groupname

相关内容:使用ctypes在Python中访问c_char_p_Array_256


你遇到了什么错误?请添加完整的回溯信息。 - yak
1
@yak:当你在玩ctypes时,追踪回溯并不总是可用的特权。如果你走出了规定的范围,Python解释器崩溃是很常见的情况。 - jsbueno
2个回答

4

D Hess帮助我找到了正确的方向;解决方案如下:

GroupArray = POINTER(Group * count)
group_array = GroupArray.from_address(addressof(myGroups))
for x in range(0,count):
    print "~~~~~~~~~~" + group_array.contents[x].groupname

3

首先创建一个新类型,它是Group数组:

GroupArray = Group * count

然后通过以下方式创建 GroupArray 的实例:

group_array = GroupArray.from_address(myGroups.value)

那么你的循环将会像这样工作:
for x in range(0,count):
    print "~~~~~~~~~~" + group_array[x].groupname

1
不幸的是,它正在打印垃圾字符。请注意,myGroups 是指向数组第一个元素的指针(一个 Group*),而不是 Group**。对 libnativetest.getGroups 的调用正在传递 myGroups 的地址,这使它成为了 Group** - verideskstar
哎呀,你说得对。那是个漏洞 - 试试我放进去的修复方法。使用 myGroups.value 而不是 addressof(myGroups)。 - David K. Hess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接