- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试为 python 编写 C 扩展。这个扩展基本上只是一个双链表。
以下是我编写的代码中的部分:-
staticforward PyTypeObject linked_list_type;
typedef struct _linked_list_object{
PyObject_HEAD
int val;
struct _linked_list_object *prev;
struct _linked_list_object *next;
} linked_list_object;
//this method adds a new node to the linked list
static linked_list_object* add_node(linked_list_object * obj, int val)
{
linked_list_object* new;
new = PyObject_New(linked_list_object, &linked_list_type);
if (new){
new->val = val;
if (obj)
{
new->prev = obj;
new->next = obj->next;
obj->next = new;
new->next->prev = new;
}
else{
new->next = new;
new->prev = new;
}
return new;
}
else
{
return NULL;
}
在我编译这个模块并将其导入 python 之后。
代码抛出一个段错误。
>>> import linked_list
Segmentation fault: 11 (core dumped)
我注意到,如果我注释掉,则不会生成此段错误
new = PyObject_New(linked_list_object, &linked_list_type);
及其下方的代码。
谁能帮我弄清楚为什么会出现这种段错误。?
我知道我遗漏了一些东西,但我不知道它是什么。
最佳答案
基于 this example从 Python 文档我认为问题是你没有提供完全初始化的 linked_list_type。
在该示例中,noddy_NoddyType 等同于您代码中的 linked_list_type,您会在顶部看到它们具有:
staticforward PyTypeObject noddy_NoddyType;
就像你一样。
无论他们有多远:
static PyTypeObject noddy_NoddyType = {
PyObject_HEAD_INIT(NULL)
0,
"Noddy",
sizeof(noddy_NoddyObject),
0,
noddy_noddy_dealloc, /*tp_dealloc*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash */
};
如示例所示,PyObject_New 使用设置为 sizeof(noddy_NoddyObject) 的成员来了解为新对象分配多少内存。我相信 staticforward 是一个变成静态的宏,这意味着
staticforward PyTypeObject linked_list_type;
将在所有字段初始化为零的情况下创建,因此 PyObject_New 将尝试为您的新对象分配 0 个字节。因此,访问该对象的任何字段涉及访问您不拥有的内存,结果是段错误。
关于c - PyObject_New 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15986558/
我正在尝试为 python 编写 C 扩展。这个扩展基本上只是一个双链表。 以下是我编写的代码中的部分:- staticforward PyTypeObject linked_list_type; t
单元测试用 C 语言编写的 Python 扩展模块相当简单(如果乏味),包括许多 Python/C API(例如 PyArg_ParseTuple)的错误案例。例如,启动实现 Python 函数或方法
我是一名优秀的程序员,十分优秀!