如何使用函数为三重指针分配内存?

时间:2015-08-24 14:59:02

标签: c++

我想使用三重指针分配内存来存储/操作数据。鉴于我必须在我的代码中的多个点分配数据,我实现了一个函数来完成它。在下面的代码中,我给出了这个函数的实现和一个简单的main方法,它说明了我在代码中如何使用这个函数。

代码编译没有错误但是当我运行程序时它会崩溃。我很感激你帮助解决这个问题。

编辑:它在该行的函数AllocateMemory中粉碎     * data [i] [j] = new double [x]; 对于i = 0和j = 1

谢谢。

int main()
{
    int x = 2;
    int y = 2;
    int z = 2;
    double*** data;//
    AllocateMemory(&data, x, y, z);
    //play with data

    FreeMemory(data, x, y, z);
    return 0;
}



void AllocateMemory(double**** data, int x, int y, int z)
{
    *data = new double**[z];

    for(int i = 0; i < z; i++)
    {
        *data[i] = new double*[y];
        for(int j = 0; j < y; j++)
        {
            *data[i][j] = new double[x];
        }

    }
}


void FreeMemory(double*** data, int x, int y, int z)
{
    for(int i = 0; i < z; i++)
    {
        for(int j = 0; j < y; j++)
        {
            delete [] data[i][j];
            data[i][j] = NULL;
        }
        delete [] data[i];
        data[i] = NULL;
    }

    delete [] data;
    data = NULL;
}

1 个答案:

答案 0 :(得分:0)

请记住,数组订阅的优先级高于解除引用运算符。这里:

*data[i] = new double*[y];

您正在订阅data,然后取消引用该指针。 data的{​​{1}}参数不是指向数组的指针,而是AllocateMemorydata的单个变量。因此,main从未初始化,并且您获得了未定义的行为。鉴于上下文,你可能会反过来说:

data[1]

您在(*data)[i] = new double*[y]; 行上有相同的错误。

您可以通过使用引用参数或 - 我建议 - 通过将指针返回到新分配的指针数组而不是将其作为参数传递来避免这种情况。