繁体   English   中英

python3中的分段错误(C)

[英]Segmentation fault in python3 (C)

我在处理代码时Program received signal SIGSEGV, Segmentation fault消息, Program received signal SIGSEGV, Segmentation fault 我的程序使用定义的结构调用C模块。

struct的定义

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;

扩展后,该对象最终(除其他事项外)还持有一个指向该类型的指针,实际上您遗漏了该事实,可能会导致整个对象崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM