python3 中的分段错误 (C)
Segmentation fault in python3 (C)
我在使用代码时收到消息 Program received signal SIGSEGV, Segmentation fault
。我的程序调用具有定义结构的 C 模块。
结构的定义
typedef struct {
char* str;
int order;
int list[10][10];
} Graph;
模块定义
static PyMethodDef GraphMethods[] = {
{ "fromString",(PyCFunction)Graph__fromString,METH_VARARGS,"desc" },
{ "order",(PyCFunction)Graph_order,METH_NOARGS,"desc" },
{ NULL }
} ;
static PyTypeObject GraphType = {
PyVarObject_HEAD_INIT( NULL,0 ) // inicjalizacja
"GL.Graph", // nazwa
sizeof( Graph ), // rozmiar
0, //
(destructor)Graph__del__, // destruktor
0,0,0,0,0,0,0,0,0,0, //
(reprfunc)Graph__str__, // obiekt -> napis
0,0,0, //
Py_TPFLAGS_DEFAULT, //
"desc.", // opis
0,0,0,0,0,0, //
GraphMethods, // metody
0,0,0,0,0,0,0, //
(initproc)Graph__init__, // inicjalizator
0, //
(newfunc)Graph__new__ // konstruktor
} ;
简单地说,我的对象由函数初始化 fromString
- 当我使用这样的构造函数时:
import GL
g = GL.Graph("A?")
g.order()
(初始化函数)
static int Graph__init__(Graph *self, PyObject *args ) {
Graph__fromString(self, args);
printf("ORDER: %d\n", self->order);
return 0;
}
程序在 g.order()
上抛出错误。
static PyObject * Graph_order( Graph *self ) {
int result = self->order;
return Py_BuildValue("i", result);
}
PyObject * Graph__fromString(Graph * self, PyObject *args) {
char * text;
// Check if user passed the argument
if (PyArg_ParseTuple(args, "s", &text)) {
self->str = text;
int i, k;
int n = strlen(text);
/* magic goes here, but im sure this is working */
}
Py_RETURN_NONE;
}
我做错了什么?这段代码在纯 C 中工作,当我将它移动到 Python 时,它在构造函数之后调用的每个方法上崩溃...
您的结构缺少 PyObject_HEAD
宏:
typedef struct {
PyObject_HEAD
char* str;
int order;
int list[10][10];
} Graph;
在扩展之后,this 最终(除其他事项外)还持有指向该类型的指针,您缺少 this 的事实可能会导致整个事情爆炸。
我在使用代码时收到消息 Program received signal SIGSEGV, Segmentation fault
。我的程序调用具有定义结构的 C 模块。
结构的定义
typedef struct {
char* str;
int order;
int list[10][10];
} Graph;
模块定义
static PyMethodDef GraphMethods[] = {
{ "fromString",(PyCFunction)Graph__fromString,METH_VARARGS,"desc" },
{ "order",(PyCFunction)Graph_order,METH_NOARGS,"desc" },
{ NULL }
} ;
static PyTypeObject GraphType = {
PyVarObject_HEAD_INIT( NULL,0 ) // inicjalizacja
"GL.Graph", // nazwa
sizeof( Graph ), // rozmiar
0, //
(destructor)Graph__del__, // destruktor
0,0,0,0,0,0,0,0,0,0, //
(reprfunc)Graph__str__, // obiekt -> napis
0,0,0, //
Py_TPFLAGS_DEFAULT, //
"desc.", // opis
0,0,0,0,0,0, //
GraphMethods, // metody
0,0,0,0,0,0,0, //
(initproc)Graph__init__, // inicjalizator
0, //
(newfunc)Graph__new__ // konstruktor
} ;
简单地说,我的对象由函数初始化 fromString
- 当我使用这样的构造函数时:
import GL
g = GL.Graph("A?")
g.order()
(初始化函数)
static int Graph__init__(Graph *self, PyObject *args ) {
Graph__fromString(self, args);
printf("ORDER: %d\n", self->order);
return 0;
}
程序在 g.order()
上抛出错误。
static PyObject * Graph_order( Graph *self ) {
int result = self->order;
return Py_BuildValue("i", result);
}
PyObject * Graph__fromString(Graph * self, PyObject *args) {
char * text;
// Check if user passed the argument
if (PyArg_ParseTuple(args, "s", &text)) {
self->str = text;
int i, k;
int n = strlen(text);
/* magic goes here, but im sure this is working */
}
Py_RETURN_NONE;
}
我做错了什么?这段代码在纯 C 中工作,当我将它移动到 Python 时,它在构造函数之后调用的每个方法上崩溃...
您的结构缺少 PyObject_HEAD
宏:
typedef struct {
PyObject_HEAD
char* str;
int order;
int list[10][10];
} Graph;
在扩展之后,this 最终(除其他事项外)还持有指向该类型的指针,您缺少 this 的事实可能会导致整个事情爆炸。