C++ PyString_AsString函数中的分段错误

C++ PyString_AsString函数中的分段错误,c++,python,C++,Python,C++代码 //quicktest.cpp #include <Python.h> #include <new> extern "C" { int test1(PyObject *src) { char *src1 = PyString_AsString(src); // <-- segmentation fault return 0; } } //quicktest.cpp #包括 #包括 外部“C” { int t

C++代码

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

char*src1=PyString_AsString(src);//[编辑:问题中的代码已更改]

函数PyString_AsString需要一个指向PyObject的指针,您正在传递一个指向char的指针。

从ctypes文档():

字节字符串和unicode字符串作为指针传递给包含其数据的内存块(char*或wchar\u t*)

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

因此,函数test1接收到一个指向char的指针,在一天结束时,PyString_AsString接收到一个指向char的指针,该指针被错误地转换为指向PyObject的指针

要了解更多信息:
使用调试器(编译C++存根,使用代码> G++-WALL-G/<代码>,然后使用<代码> GDB Python < /C>。我猜
src
可能为null或未初始化。您确定ctypes将以
PyObject*
的形式传递字符串吗?
ctypes
可能会将对象转换为
char*
,从而产生segfault。事实上,读取它的状态“除整数、字符串和字节对象外的所有Python类型都必须包装在相应的ctypes类型中,以便将它们转换为所需的C数据类型”,这意味着字符串
“文本“
自动转换为
char*
并传递给函数。谢谢Basile,但我已经使用了gdb。不过,这是对的。谢谢,Bakuriu,你是对的-将“PyObject*”更改为“char*”帮助。当然我不再需要PyString了。正如我在帖子中看到的,我将PyObject*传递给函数,而不是char*。所以你错了。对不起,beatt,你是对的,但我在你的评论“将PyObject*”更改为“char*”帮助之后回答了。我将尝试修复我的答案。
import ctypes
test_lib = ctypes.CDLL('./quicktest.so');
test_lib.test1("test")  #  <-- segmentation fault