c++ - C++ 指针没有更新?
问题描述
不完全确定如何措辞标题,但我会尽我所能解释。我有一个程序,它最初使用了一个设定大小的二维数组,所以它被定义为:
typedef char Map[Row][Col];
我现在正在尝试为它动态分配内存,它现在也变成了基于输入的可变大小。现在定义为:
typedef char** Map;
在我的主要方法中,我最初有:
Map map;
readUserInput(map);
基本上 readUserInput 将地图数组作为参数,并根据用户输入为其分配值。然后映射包含值并用于其他功能。
我已经更新了 readUserInput 函数,以便它动态调整数组大小并为其分配/取消分配内存。这工作正常,但问题来自这样一个事实,即现在在 main 方法中,地图没有被更新。main 中的上述代码现在如下所示:
Map map = nullptr;
readUserInput(map);
但运行 readUserInput 函数后,map 仍然为空。在函数内部,地图更新得很好,所以我不理解更改之间的区别。
解决方案
你传递给函数的是一个指向数组的指针,函数不能改变它。但是在大多数情况下,用指向指针的指针替换数组是不正确的。指向指针的指针表明具有一维指针数组。这可能(或可能不)指向其他数组。这种数据组织有时被称为锯齿状数组,因为它允许每一行具有单独的长度。但是在实践中,锯齿状数组及其子类稀疏矩阵通常实现为一维数组以避免重新分配。
为避免衰减并将整体数组实际存储在内存中,您应该使用一维数组,最好使用封装进行指针算术和重新分配,然后将引用传递给存储所有必需状态的对象。参考确保对象是可变的功能(例如智能指针版本):
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;
}
推荐阅读
- javascript - How to run some code before page is displayed
- bash - grep 多个文件中的多个字符串,并在找到第一个匹配项时停止处理其他文件
- c# - 嵌套的 if 条件与多个单独的 if 条件,每个条件都有 return 语句
- mysql - 您如何记录使用 SQL 访问数据库的程序?
- gcc - 实在看不懂gcc怎么初始化数组
- c# - 文件打开 dotnet core 2.1 System.IO.IOException
- android - 我越来越未定义不是一个对象(评估'this.props.navigation.navigate')
- python - inspect.signature 究竟如何与类一起工作?
- pentaho - 我可以从 pentaho 中的 URL 获取参数吗?
- c# - .NET Console.Readline 不读取输入的第一行