gpt4 book ai didi

python - ctypes - 函数仅返回空字符串

转载 作者:行者123 更新时间:2023-12-01 01:48:24 27 4
gpt4 key购买 nike

我在使用 ctypes 调用 C++ 库(用 extern C 包装)中的函数时遇到问题,该函数应该返回字符串。我很确定我已经将 ctypes 接口(interface)的 argtypes 和 restype 正确设置为一个应该返回字符串的函数,但无论如何我只得到一个空字符串作为返回结果。

C++ 代码:

const char* disasmC_PEProgram_getSections(PEProgram *p) {
return p->getSections().c_str();
}

Python 代码:

lib.disasmC_PEProgram_getSections.argtypes = [ctypes.c_void_p]
lib.disasmC_PEProgram_getSections.restype = ctypes.c_char_p
resultStr = lib.disasmC_PEProgram_getSections(self.peProgram_p)

# Displays empty string for resultStr!
print "Result: %s" % (resultStr,)

最佳答案

我的猜测是从 disasmC_PEProgram_getSections() 返回的值是一个局部变量或包含空值或其他内容。提供MCVE如果您需要更具体的帮助。

这是我的 MCVE,显示您的 Python 代码是正确的。请注意,我的 C++ 代码返回对对象中字符串的引用,以确保字符串的生命周期持续到对象被销毁为止。

测试.cpp

#include <string>
using namespace std;

#define API __declspec(dllexport) // Windows-specific export

class PEProgram
{
string section;
public:
PEProgram() : section("section") {}
const string& getSections() const { return section; }
};

extern "C" {
API PEProgram* PEProgram_new() { return new PEProgram(); }
API void PEProgram_delete(PEProgram* p) { delete p; }
API const char* disasmC_PEProgram_getSections(PEProgram *p) {
return p->getSections().c_str();
}
}

测试.py

#!python36
import ctypes

lib = ctypes.CDLL('test')
lib.PEProgram_new.argtypes = None
lib.PEProgram_new.restype = ctypes.c_void_p
lib.PEProgram_delete.argtypes = [ctypes.c_void_p]
lib.PEProgram_delete.restype = None

p = lib.PEProgram_new()

lib.disasmC_PEProgram_getSections.argtypes = [ctypes.c_void_p]
lib.disasmC_PEProgram_getSections.restype = ctypes.c_char_p
resultStr = lib.disasmC_PEProgram_getSections(p)

# Displays empty string for resultStr!
print(f'Result: {resultStr}')

lib.PEProgram_delete(p)

输出

Result: b'section'

请注意,如果我的类(class)是:

class PEProgram
{
public:
string getSections() const { return "section"; }
};

然后我得到 b'' 作为 Python 中的值。这是因为 disasmC_PEProgram_getSections 返回的字符串现在是一个临时值,在函数 disasmC_PEProgram_getSections 返回后会被销毁。返回的 const char* 现在指向已释放的内存,并且会发生未定义的行为。

关于python - ctypes - 函数仅返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50989459/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com