与此相关: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干杯