双指针作为参数

时间:2016-05-24 14:47:32

标签: c++ function double-pointer

我有以下原型:

int Split(const char* str, const char* delim,unsigned int& numtokens,char **tokensRes)

最后一个参数用于返回此函数的响应。在函数中我们有以下内容:

.
.
char **tokens =(char**) calloc(tokens_alloc, sizeof(char*));
.
.
.
//at the end of the code
tokensRes = tokens;
.

当函数返回char**时直接返回tokens变量的值时,我收到正确的答案,但使用上面的方法返回该函数是空的。如何使此功能正常工作?

编辑1: 我的意图是接收一个char数组数组,例如:

array[0] = "ABC"
array[1] = "ABC"
array[2] = "ABC"
array[3] = "ABC"

3 个答案:

答案 0 :(得分:1)

假设您要返回一个字符串数组(char**),那么您需要将指针传递给您可以分配的数组。也就是说,您需要传递char***并将其分配为*tokensRes = tokens

答案 1 :(得分:1)

抛弃普通的C类型并使用C ++类型:

std::vector<std::string> Split(std:;string const& str, std::string const& delim, unsigned int& numtokens);

如果你必须坚持使用C接口,你需要一个带有三重指针的额外间接(我假设你想要返回一个令牌字符串数组)。

int Split(const char* str, const char* delim,unsigned int& numtokens,char ***tokensRes)

char** tokens;
Split("String;String", ";", 2, &tokens);

我真的不喜欢输出参数,我总是想知道为什么有人在C ++中不使用std::string

已在许多库中实现了令牌化,例如在boost::splitboost::tokenizer中。无需重新发明轮子:

// simple_example_1.cpp
#include<iostream>
#include<boost/tokenizer.hpp>
#include<string>

int main(){
   using namespace std;
   using namespace boost;
   string s = "This is,  a test";
   tokenizer<> tok(s);
   for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
       cout << *beg << "\n";
   }
}
  

simple_example_1的输出是:

This
is
a
test

答案 2 :(得分:1)

更改原型:

int Split(const char* str, const char* delim,unsigned int& numtokens,char **tokensRes)

要:

int Split(const char* str, const char* delim,unsigned int& numtokens,char ** &tokensRes)

代码tokensRes = tokens;将起作用。要了解为何要了解有关C ++和references的更多信息。

如果您计划从C风格的编码转换为C ++编码,则有关使用字符串的其他答案是有效的。编码的简易性会提高很多,并且不必担心内存管理和指针(通常不会),这些都是由类自动完成的。只要您遵循良好的做法,例如通过引用传递对象而不是值,就不用担心性能下降。