void函数中的2darray动态分配

时间:2014-03-30 07:18:22

标签: c++

我想在void函数中分配2乘4的2D数组。 我可以在int函数中分配它。但我无法使用无效功能。 为什么我不能在void函数中分配2dArrays?

这是代码。

#include <iostream>
void _2DArray(int *** arr)
{
    ** arr = new int * [2];
    for (int x = 0; x < 2; x++) {
        arr[x] = new int[4];
    }

    for (int x = 0; x < 2; x++) {
        for (int y = 0; y < 4; y++) {
            arr[x][y] = 4*x + y;
        }
    }
}

int main()
{
    int **arr = NULL;
    _2DArray(&arr);
    for (int x = 0; x < 2; x++) {
        for (int y = 0; y < 4; y++) {
            std::cout << arr[x][y] << " ";
        }
        std::cout << "\n";
    }
    return 0;
}

我不知道为什么我不能分配它。 请帮助我。

3 个答案:

答案 0 :(得分:3)

std::vector<std::vector<int>> Create2DArray(int width, int height)
{
    std::vector<std::vector<int>> data(height, std::vector<int>(width));

    for (int y = 0; y < data.size(); y++)
    {
        for (int x = 0; x < data[y].size(); x++)
        {
            data[y][x] = 4*x + y;
        }
    }

    return data;
}

答案 1 :(得分:2)

你在函数参数中有太多*个。一旦超过2 * s,你应该重新考虑你想要做的事情。话虽如此,这里是如何使这个功能发挥作用。

void _2DArray(int *** arr)
{
    *arr = new int * [2];
    for (int x = 0; x < 2; x++) {
        (*arr)[x] = new int[4];
    }

    for (int x = 0; x < 2; x++) {
        for (int y = 0; y < 4; y++) {
            (*arr)[x][y] = 4*x + y;
        }
    }
}

答案 2 :(得分:1)

根据standard,保留以下划线开头的全局函数。尝试重命名

_2DArray()

Create2DArray()

来自doc:

  

...保留名称包括以下划线('_')开头的所有外部标识符(全局函数和变量),以及以两个下划线开头或后跟大写字母的下划线的所有标识符都保留名。这样,库和头文件可以为内部目的定义函数,变量和宏,而不会有与用户程序中的名称冲突的风险。

编辑:@ user3386109的答案解决了您的问题。使用std::vector的解决方案会更好,因为@ Neil Kirk建议