【问题标题】:Access array of c-structs using Python ctypes使用 Python ctypes 访问 c-structs 数组
【发布时间】:2026-02-16 21:30:01
【问题描述】:

我有一个 C 函数,它在传递给的地址分配内存并通过 Python 访问。指针内容确实包含 C 代码中的结构数组,但我无法让 ctypes 正确访问第 0 个元素之外的数组。如何获得正确的内存偏移量以访问非零元素?如果我尝试使用他们的 ctypes.memset 函数,Python 的 ctypes.memset 会抱怨 TypeErrors。

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

相关:Access c_char_p_Array_256 in Python using ctypes

【问题讨论】:

  • 您遇到什么错误?请添加整个回溯。
  • @yak:当一个人在玩 ctypes 时,回溯是一种并不总是可用的特权。如果你越界了,规范是 Python 解释器以段错误结束

标签: python c pointers ctypes


【解决方案1】:

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

GroupArray = Group * count

然后以这种方式创建一个 GroupArray 的实例:

group_array = GroupArray.from_address(myGroups.value)

然后你的循环会像这样工作:

for x in range(0,count):
    print "~~~~~~~~~~" + group_array[x].groupname

【讨论】:

  • 不幸的是,那是打印垃圾字符。请注意,myGroups 是指向数组第一个元素的指针(Group*),而不是Group**。对libnativetest.getGroups 的调用传递了myGroups 的地址,这使其成为Group**
  • 糟糕,你是对的。这是一个错误 - 尝试我放入的修复程序。使用 myGroups.value 而不是 addressof(myGroups)。
【解决方案2】:

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

【讨论】: