将 std::string 的向量转换为 char***

Posted

技术标签:

【中文标题】将 std::string 的向量转换为 char***【英文标题】:Cast a vector of std::string to char*** 【发布时间】:2014-12-29 11:12:50 【问题描述】:

我有一个 API 函数,它需要一个 char*** 参数并希望传递一个 vector<std::string>std::string 的成员函数可以让我这样做吗?

这样,我只得到指向第一个元素的 char 指针:

std::vector<std::string> oList(128);
myFunction(oList[0].c_str());

【问题讨论】:

为什么API需要第三级间接?字符串向量应该是char**,而不是char*** 【参考方案1】:

“是否有 std::string 的成员函数可以让我这样做?”

简而言之:没有。

std::vector&lt;std::string&gt;std::string 实例存储在一个连续的数组中,并不意味着指向这些字符串实例的底层char 数组的指针在内存中连续出现。

【讨论】:

【参考方案2】:

无法将整个向量转换为指向指针的指针数组。您可以将vector 的活动部分视为向量元素的数组,但在这种情况下,它将是string 对象的数组,而不是指向char* 的指针。试图将其重新解释为其他任何内容都是未定义的。

如果您确定 API 不会触及 char* 字符串的内容(例如,因为它是 const-qualified),您可以创建一个指针数组,并将调用结果放入 @ 987654326@上vector的元素进去,像这样:

char **pList = new char*[oList.size()];
for (int i = 0 ; i != oList.size() ; i++) 
    pList[i] = oList[i].c_str();

myTrippleStarFunction(&pList); // Use & to add an extra level of indirection
delete[] pList;

但是,您需要非常小心地将这样的数组传递给使用额外间接级别的 API,因为它可能需要第三个星号来更改您传递的指针,例如,通过重新分配数组。在这种情况下,您可能必须使用不同的机制来分配动态内存以匹配 API 使用的机制。

【讨论】:

你为什么要使用 C 数组呢?!如果myTrippleStarFunction() 可以抛出会怎样?? 如果被调用的函数在指针上调用free()怎么办?毕竟,如果它采用char***,它可能是一个 C API。真的,这个问题是含糊其辞地有意义地回答它。 嗯,是的,你可以做到这一点——通过发布可怕的代码,提示显然是一个完全新手使用手动内存管理,以及——鉴于我们不知道API 需要一个指向指向非const 字符串的指针的指针——至少与实际解决问题一样可能在 OP 的脸上爆炸。

以上是关于将 std::string 的向量转换为 char***的主要内容,如果未能解决你的问题,请参考以下文章

在 std::string 中仅将数字转换为 int

如何将“char”转换为“std::string”? [复制]

将 std::String 转换为 char * [重复]

不存在从“const std::string”到“char *”的合适转换函数?

如何将 std::string 转换为 const char*? [复制]

如何将 std::vector<std::string> 转换为 C api 的 char*[] [重复]