注意:虽然这个答案可能很好地解释了问题,但是推荐创建一个自动变量char*[2];
而不是像这个答案一样使用new
进行分配。
原始答案:
问题在于char c[2][2]
是一个连续的char
块。编译器只分配了4个char
对象。
当您构建一个数组的数组(char** c
)时,您需要手动分配一个char
指针的数组,然后为每个指针分配(或赋值)一个char
数组。
因此,要将您的数组char c[2][2]
转换为数组的数组,您首先必须创建指针数组,然后将每个char数组的第一个元素的数组分配给该指针。
像这样:
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[])
{
char c[2][2]={
{'a','b'},
{'c','d'}
};
char** param = new char*[2];
param[0] = &c[0][0];
param[1] = &c[1][0];
func(param);
delete[] param;
}
如果你使用的是
C++11
,你可以使用智能指针来防止内存泄漏,即使出现异常或者有人忘记执行
delete
。
int main(int, char* argv[])
{
char c[2][2]={
{'a','b'},
{'c','d'}
};
std::unique_ptr<char*[]> param(new char*[2]);
param[0] = &c[0][0];
param[1] = &c[1][0];
func(param.get());
}
char [][]
的副本,转换为char**
或者 转换为指向字符串的char**
指针数组?(例如,您最终是否尝试使用printf("%s\n", array[i]);
打印字符串?)我们必须知道您的main函数
如何处理char**
,否则我们只能猜测... - David C. Rankin