Python 返回的 ctypes c_char_p 已损坏

Python ctypes returned c_char_p is corrupted

我有一个包含以下内容的 C++ 接口:

extern "C"
{
     char const* getValForEntry(Entry e)
     {
         std::string no_val = "__err::no_val";
         if (handles.find(e) != handles.end())
         {
             std::string val = handles[e]->get_value();
             return val.c_str();
         }
         else
             return no_entry.c_str();
     }
}

我有一个 python 应用程序使用 ctypes 连接到此接口,如下所示:

self.lib.getUpdateForEntry.restype = c_char_p
val = self.lib.getUpdateForEntry(e)

接口returns字符串:

{"RVC HR1":{"Mode":1,"Seq Num":162,"Home":7,"Time":"Thu Sep 01 10:00:00 2000","Flags":0,"Data Len":1024,"Data":[26, ... an array of 1024 values ... ,239]}}

python 应用看到的是:

p??"Mode":1,"Seq Num":162,"Home":7,"Time":"Thu Sep 01 10:00:00 2000","Flags":0,"Data Len":1024,"Data":[26, ... an array of 1024 values ... ,239]}}

该消息应该是一个包含 2844 个字符的字符串,但在 python 中,前 12 个字符总是损坏的,我看到消息:

'utf8' codec can't decode byte 0xb1 in position 1: invalid start byte

如果我将消息调整为数组中只有少量值(10 个以下),则消息没有问题,但是当我添加更多值时,消息的第一部分会损坏。有谁知道我为什么看到这个?是否有最大 c_char_p 长度,或者它是否作为 ascii 返回并转换为 unicode?还是别的什么?

请参阅上面的 Paul McKenzie 和用户 4581301 评论以获取解释。局部变量 val 超出范围,导致未定义的行为。