C++ PyString_AsString函数中的分段错误
C++代码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
//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