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
你能解释一下,我的代码中的错误在哪里?
答案 0 :(得分:3)
[编辑:问题中的代码已更改]
函数PyString_AsString需要一个指向PyObject的指针,并且您正在向char传递指针。
Python/C API Reference Manual
来自ctypes文档(Calling functions):
秒>
字节字符串和unicode字符串作为指针传递给包含其数据的内存块(char *或wchar_t *)
现在,在更改问题之后,在调用test1函数时,您正在不正确地将指向char的指针转换为指向PyObject的指针。
因此函数test1正在接收一个指向char的指针,并且在一天结束时,PyString_AsString正在接收一个指向char的指针,该指针被错误地转换为指向PyObject的指针。
要了解更多信息: Python C/API tutorial