使用ctypes在Python中访问struct的动态数组

时间:2015-05-21 17:27:42

标签: python c arrays struct ctypes

与此相关:python ctypes array of structs

我在C中有一个struct结构。我正在动态创建其中一个,并希望使用ctypes在python中访问它。

以下是一个例子:

foo.c的

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "foo.h"

MyStruct * ms;

void setIt()
{
        ms = (MyStruct *)(calloc(1, sizeof(MyStruct)));
        ms->a = 10;
        ms->b = 99.99;
        ms->dynamic_p = (Point *)(calloc(2, sizeof(Point)));
        int i;
        for(i=0; i<5; i++)
        {
                ms->p[i].x = i*5;
                ms->p[i].y = i*10;
        }       
        for(i=0; i<2; i++)
        {
                ms->dynamic_p[i].x = i+88;
                ms->dynamic_p[i].y = i+88;
        }
}

MyStruct * retIt()
{
        return ms;
}

void main()
{
        setIt();
        printf("a: %d\n", ms->a);
        printf("p[0].x: %d\n", ms->p[3].x);
        printf("dynamic_p[0].y: %d\n", ms->dynamic_p[0].y);
}

foo.h中

#ifndef FOO_H
#define FOO_H

typedef struct POINT
{
        int x;
        int y;
}Point;

typedef struct MYSTRUCT
{
        int a;
        double b;
        Point p[5];
        Point * dynamic_p;
}MyStruct;

void setIt();

MyStruct * retIt();

#endif

使用gcc -shared -o test.so -fPIC foo.c编译后

test.py

import ctypes
class Point(ctypes.Structure):
 _fields_ = [('x', ctypes.c_int), ('y', ctypes.c_int)]


class MyStruct(ctypes.Structure):
 _fields_ = [('a', ctypes.c_int), ('b', ctypes.c_double), ('p', Point*5), ('dynamic_p', ctypes.POINTER(Point))]


simulator = ctypes.cdll.LoadLibrary('your/path/to/test.so')

simulator.retIt.restype = ctypes.POINTER(MyStruct)
simulator.setIt()
pyMS = simulator.retIt()

pyMS.contents.dynamic_p[0].x

我可以毫无问题地访问p数组。

最后一行返回分段错误。我知道我必须访问非法的内存部分。但我尝试了所有类型的组合,无法让它发挥作用。

真的很感激这个主题的任何亮点。

编辑:最后发布了错误的python代码并忘记了dynamic_p feild

干杯

0 个答案:

没有答案