【发布时间】:2020-08-31 05:16:17
【问题描述】:
我正在寻找通过 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++ 中处理字符串数组的正确方法吗?我的最终目标是以一种我可以使用ctypes 在 Python 中访问的方式存储字符串。
【问题讨论】:
-
第二个
sizeof应该是strlen(...) + 1。