我有char[][]
char c[2][2]={
{'a','b'},
{'c','d'}
};
如何将其转换为char**
?
此处的目标是使用转换后的char**
作为主函数的输入,该函数仅接受char**
作为其输入。两种C / C ++解决方案都是可以接受的。
答案 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}}就像这个答案那样。
原始回答:
问题是new
是char 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