将char [] []转换为char **

时间:2015-05-18 22:00:10

标签: c++ c arrays pointers

我有char[][]

  char c[2][2]={
    {'a','b'},
    {'c','d'}
  };

如何将其转换为char**

此处的目标是使用转换后的char**作为主函数的输入,该函数仅接受char**作为其输入。两种C / C ++解决方案都是可以接受的。

4 个答案:

答案 0 :(得分:6)

虽然您可以轻松地从char[]切换到char*,但char[][]char**无法实现相同的目标:

  • 您的char[2][2]是一个二维数组,其中所有元素都是连续存储的。要访问一个元素,编译器会根据每行的大小计算偏移量。
  • char**指向包含指向char的指针的数组。要访问一个元素,您的编译器会计算最左侧指针的偏移量,加载该poitner,然后访问该元素。

解决方法:

char *pc[2]={c[0],c[1]}; 
cout << pc[1][1]<<endl;   // prints out the same as c[1][1]
// you can pass `pc` when a `char**` is needed

备注: 此编译完美。但是,一些带有char **av之类参数的函数实际上期望av[i]是一个空终止的c-string。在这种情况下,虽然您的代码会编译,但结果可能不是您所期望的(缓冲区溢出)。

答案 1 :(得分:2)

您无法将protected Integer doInBackground(Integer... params) { try { DefaultHttpClient client = new DefaultHttpClient(); OAuthConsumer consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); consumer.setTokenWithSecret(ACCESS_TOKEN, ACCESS_TOKEN_SECRET); HttpGet request = new HttpGet(); request.setURI(new URI("https://stream.twitter.com/1/statuses/filter.json?track=" + mSearchTerm)); consumer.sign(request); HttpResponse response = client.execute(request); InputStream in = response.getEntity().getContent(); BufferedReader reader = new BufferedReader( new InputStreamReader(in) ); parseTweets(reader); in.close(); } 转换为char[2][2],只能将其转换为char**

char(*)[2]

以上是指向array-of-2-char的指针。请注意,您需要此char (*p)[2] = c; 并且不能只写2,因为在后一种情况下您无法执行指针运算(指针不会知道&#34;跳转&#34;递增时,你不能解决数组的元​​素(在这种情况下是行)。

答案 2 :(得分:2)

您可以将数组传递给函数,如下所示:

char c[2][2] = {
    {'a','b'},
    {'c','d'}
};

char* x[] { c[0], c[1] };
func(x); // Assuming something like: void func(char** p);

答案 3 :(得分:1)

注意:虽然这个答案可以很好地解释/说明问题,但建议创建自动变量 char*[2];而不是分配{ {1}}就像这个答案那样。

原始回答:

问题是newchar c[2][2]的连续块。编译器只分配4个char个对象。

构建数组char)时,需要手动将指针数组分配给char** c然后分配(或分配)和char的数组到每个指针。

所以要你的数组char转换为数组,你必须首先创建指针数组,然后分配第一个元素的数组每个 char 数组的内容。

这样的事情:

char c[2][2]

如果你有void func(char** c) { for(int x = 0; x < 2; ++x) for(int y = 0; y < 2; ++y) std::cout << c[x][y] << ' '; std::cout << '\n'; } int main(int, char* argv[]) { // one contiguous block of 4 chars char c[2][2]={ {'a','b'}, {'c','d'} }; char** param = new char*[2]; // create your own pointer array param[0] = &c[0][0]; // assign the first element of each char array param[1] = &c[1][0]; func(param); // call your func delete[] param; // cleanup } ,你可以使用智能指针来防止内存泄漏,如果抛出异常或有人忘记C++11

delete