首页 > 解决方案 > C++ 指针没有更新?

问题描述

不完全确定如何措辞标题,但我会尽我所能解释。我有一个程序,它最初使用了一个设定大小的二维数组,所以它被定义为:

typedef char Map[Row][Col];

我现在正在尝试为它动态分配内存,它现在也变成了基于输入的可变大小。现在定义为:

typedef char** Map;

在我的主要方法中,我最初有:

Map map;
readUserInput(map);

基本上 readUserInput 将地图数组作为参数,并根据用户输入为其分配值。然后映射包含值并用于其他功能。

我已经更新了 readUserInput 函数,以便它动态调整数组大小并为其分配/取消分配内存。这工作正常,但问题来自这样一个事实,即现在在 main 方法中,地图没有被更新。main 中的上述代码现在如下所示:

Map map = nullptr;
readUserInput(map);

但运行 readUserInput 函数后,map 仍然为空。在函数内部,地图更新得很好,所以我不理解更改之间的区别。

标签: c++

解决方案


你传递给函数的是一个指向数组的指针,函数不能改变它。但是在大多数情况下,用指向指针的指针替换数组是不正确的。指向指针的指针表明具有一维指针数组。这可能(或可能不)指向其他数组。这种数据组织有时被称为锯齿状数组,因为它允许每一行具有单独的长度。但是在实践中,锯齿状数组及其子类稀疏矩阵通常实现为一维数组以避免重新分配。

为避免衰减并将整体数组实际存储在内存中,您应该使用一维数组,最好使用封装进行指针算术和重新分配,然后将引用传递给存储所有必需状态的对象。参考确保对象是可变的功能(例如智能指针版本):

class Map 
{
    int rows, cols;
    char *data;
public:
    Map() : rows(), cols(), data(nullptr) {}
    Map(int r, int c) : rows(r), cols(c), data(new char[r*c]()) {}
    ~Map() { delete[] data; }

    void resize(int r, int c) {
        if(rows == r && cols == c) return;

        char* tmp = new char[r*c]();

        if(data) 
        {
            // copy old data here if required


            delete[] data;
        }
        row = r; col = c;
        data = tmp;
    }

    char& operator() (int r, int c) { return data[r*cols + c]; }
    char operator() (int r, int c) const  { return data[r*cols + c]; }
};

注意:如果必须允许任何复制,则此类需要执行复制和移动操作。

函数原型将是:

void readUserInput(Map& map);

使用这样的类,您可以像这样简单地进行动态调整大小、存储其大小和地址元素:

int main()
{
    Map test(4, 5); // declaring and allocating memory

    test.resize(3,3);   // reallocating

    test(1,1) = 3; // writing

    //reading
    std::cout << +test(1,1) << std::endl;
}

推荐阅读