我不知道为什么,但是它不返回我在函数中声明的二维数组。
char** canvas() {
char canvas[18][8];
fill(canvas[0], canvas[0] + 18 * 8, 'O');
return canvas;
}
最佳答案
canvas
是一个局部变量,当函数超出范围时,它的生存期将终止,然后通过指针访问此变量将调用未定义的行为。
该函数的返回类型也与您要返回的对象不兼容。
如果必须使用C样式的数组(从您的注释中推断),则可以执行以下操作:
char (*canvas())[8] //pointer to array return type
{
char (*canvas)[8] = new char[18][8]; //C++ manual allocation
//std::fill(canvas[0], canvas[0] + 18 * 8, 'O'); //works
std::fill_n(canvas[0], 18 * 8, 'O'); //better, as suggested by Ted Lyngmo
return canvas;
}
然后可以这样称呼它:int main()
{
char(*canv)[8] = canvas(); //assign it
for (int i = 0; i < 18; i++) //use it like a 2D array
{
for (int j = 0; j < 8; j++)
{
std::cout << canv[i][j];
}
std::cout << std::endl;
}
delete[] canv; //delete object after it's used
}
当您使用C++时,我建议使用STL容器,例如
std::vector
(即 vector std::vector<std::vector<char>>
的 vector ),您也可以使用 std::array
,因为在编译时已知尺寸,即std::array<std::array<char, 8>, 18>
。对于C++
std::array
实现:std::array<std::array<char, 8>, 18> canvas()
{
std::array<std::array<char, 8>, 18> canvas;
std::fill_n(canvas.begin()->begin(), 18 * 8, 'O');
return canvas;
}
int main()
{
std::array<std::array<char, 8>, 18> canv = canvas();
//...
}
对于std::vector
实现:std::vector<std::vector<char>> canvas()
{
std::vector<std::vector<char>> canvas{18, std::vector<char>(8, '0')};
return canvas;
}
int main()
{
std::vector<std::vector<char>> canv = canvas();
//...
}
在这两种情况下,您都可以像第一个示例中一样使用C样式的for
循环,但是也可以使用基于范围的for循环,因为这样做可以避免超出数组范围,从而避免不确定的行为,因此效果更好。for (auto& a : canv)
{
for (auto& ch : a)
{
std::cout << ch;
}
std::cout << std::endl;
}
在所有情况下的输出:
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
OOOOOOOO
关于c++ - 将指针返回二维数组[C++],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63465107/