gpt4 book ai didi

c - PyObject_New 的段错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:49 24 4
gpt4 key购买 nike

我正在尝试为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com