You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Py_BuildValue返回异常:C++扩展返回内存地址而非预期字符串

Python扩展调用返回乱码问题排查

你遇到的问题根源很明确:直接把C++的std::string对象传给Py_BuildValue("s", ...)是错误的。

问题原因

Py_BuildValue的s格式符要求传入的是C风格的const char*指针,指向以\0结尾的字符数组。但你直接传了std::string对象——这是一个C++类,它的内存布局里包含指针、长度等成员,编译器会把这个对象的内存内容当成字符序列来解析,自然就输出了类似内存地址的乱码内容,而不是你期望的大写字符串。

修复方案

只需要把std::string转换成C风格字符串再传入,调用std::string的c_str()方法就能拿到符合要求的const char*指针:

using namespace boost::algorithm;
static PyObject* strtest(PyObject* self, PyObject* args) {
    std::string s = "Boost C++ Libraries";
    to_upper(s);
    // 调用c_str()获取C风格字符串指针
    PyObject * python_val = Py_BuildValue("s", s.c_str());
    return python_val;
}

额外说明

不用担心字符串生命周期的问题:Py_BuildValue在处理s格式时,会拷贝传入的C字符串内容到新创建的Python字符串对象里,所以即使原std::string在函数结束后被销毁,Python字符串依然能正常使用。

内容的提问来源于stack exchange,提问作者user2723494

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:25:43