1

C++ 代码

//quicktest.cpp
#include <Python.h>
#include <new>
extern "C" 
{
    int test1(PyObject *src)
    {
    char *src1 = PyString_AsString(src);  // <-- segmentation fault
    return 0;
    } 
}

Python代码

import ctypes
test_lib = ctypes.CDLL('./quicktest.so');
test_lib.test1("test")  #  <-- segmentation fault

PyString_AsString 调用中存在分段错误(“收到 SIGSERV”)。

Linux 64位,python2.7

你能解释一下,我的代码中的错误在哪里?

4

1 回答 1

3

[编辑:问题中的代码已更改]

PyString_AsString 函数需要一个指向 PyObject 的指针,而您正在传递一个指向 char 的指针。 Python/C API 参考手册

来自 ctypes 文档(调用函数):

字节字符串和 unicode 字符串作为指向包含其数据的内存块的指针传递(char * 或 wchar_t *)

现在,在更改问题后,您在调用 test1 函数时不正确地将指向 char 的指针转换为指向 PyObject 的指针。

所以函数 test1 正在接收一个指向 char 的指针,并且在一天结束时,PyString_AsString 正在接收一个指向 char 的指针,错误地转换为指向 PyObject 的指针。

要了解更多信息: Python C/API 教程

于 2013-09-04T10:08:20.043 回答