运行python main.py报segmentation fault,C++扩展模块调用问题排查
段错误原因
核心是PyArg_ParseTuple调用时参数类型不匹配,触发了非法内存访问:
- 格式符
"i"要求传入int*类型的参数,用于将Python传入的整数解析为C int类型后存入对应内存地址 - 代码中定义了
const int *prop;,传入的&prop实际是int**类型,不符合要求 - 这会导致解析到的整数值(比如示例中的18)被直接写入指针变量
prop的内存空间,相当于prop被强制赋值为指向内存地址0x12,后续执行*prop读取该地址内容时触发非法访问,导致段错误。
修复方案
将prop修改为普通int类型变量,传入其地址给PyArg_ParseTuple即可,修改后的method_sum函数代码如下:
static PyObject *method_sum(PyObject *self, PyObject *args) { int prop; // 改为普通int变量,不需要指针 if (!PyArg_ParseTuple(args, "i", &prop)) return NULL; int result = prop + prop; // 直接访问变量即可,不需要解引用 return Py_BuildValue("i", result); }
修改后重新执行编译安装流程,再运行python main.py即可正常输出36。
内容的提问来源于stack exchange,提问作者Tillmann
相关产品推荐
相关产品推荐

