我正在寻找通过C ABI访问字符串向量的正确方法。我的代码大致是这样的。
#include <iostream>
#include <vector>
#include <cstring>
// A C++ class containing information in a std::vector<std::string> that I want to expose in C (for eventually exporting to python via shared library)
class AVectorOfStrings{
private:
std::vector<std::string> vec;
public:
explicit AVectorOfStrings(std::vector<std::string> vec) : vec(std::move(vec)){}
const vector<std::string> &getVec() const {
return vec;
}
void setVec(const vector<std::string> &vec) {
AVectorOfStrings::vec = vec;
}
};
extern "C" {
// function for accessing the strings
char** getArrayOfCharStars(AVectorOfStrings* vec){
std::vector<std::string> strings = vec->getVec();
char **arr = (char **) malloc(strings.size() * sizeof(char *));
for (int i = 0; i < strings.size(); i++) {
arr[i] = (char *) malloc(sizeof(strings[i].c_str()));
strcpy(arr[i], strings[i].c_str());
}
return arr;
}
}
// usage
int main(){
std::vector<std::string> input = {"1string", "2string", "3string"};
AVectorOfStrings vec(input);
char** arr = getArrayOfCharStars(&vec);
// A bunch of attempts to access the three strings.
std::cout << *arr << std::endl;
std::cout << *arr[1] << std::endl;
std::cout << *(arr[1]) << std::endl;
std::cout << **arr << std::endl;
return 0;
};
这段代码返回以下结果
1string
2
2
1
获取这些字符串的访问权的正确方法是什么?更一般地说,这是在C++中处理字符串数组的正确方法吗?我的最终目标只是让这些字符串以一种我可以在Python中使用 ctypes
.
看来,如果使用以下方法会简单得多 pybind
并将stl std::vector<std::string>
直接。你有一个例子 此处.
class AVectorOfStrings {
std::vector<std::string> vec;
};
/* ... binding code ... */
py::class_<AVectorOfStrings>(m, "AVectorOfStrings")
.def(py::init<>())
.def_readwrite("contents", &AVectorOfStrings::contents);