c++ - 将指针返回二维数组[C++]

标签 c++ arrays vector

我不知道为什么,但是它不返回我在函数中声明的二维数组。

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/

相关文章:

javascript - 为什么 Java 和 Javascript 中的字节数组表示不同?

c - 如何确定 C Vector 中的内存槽是否已填满?

c++ - Directx 11 Bitblt 替代方案

c++ - 你能在 std::getline 中指定什么不是定界符吗?

java - 二叉搜索树到 inOrder 数组

php - mysqli_fetch_array() foreach 循环重复

c++ - 我可以安全地复制 vector<array> 吗?

for-loop - 如何在循环内创建向量的向量?

c++ - 为什么栈尾为空?

c++ - GCC 的 __attribute__ ((__packed__)) 的 Visual C++ 等效项