【发布时间】:2021-07-24 04:09:24
【问题描述】:
所以我有一个节点结构
struct Node
{
int x = 0;
};
我赚了 20 个Node*s。我的理解是Node** 是一个指向数组开头的指针,该数组包含指向Nodes 的指针。
constexpr int mazeSize = 20;
Node** testMaze = new Node * [mazeSize];
在此之后,当我尝试对其进行任何操作时,我开始收到警告和错误。例子:
testMaze[0]->position.x == 0; //->Using uninitialized memory `*testMaze` and
我从这个错误中了解到:*testMaze 正在取消引用指针数组,这意味着它引用了该数组中的第一个 Node 对象。如果是这种情况,我将如何初始化它?如果我只是这样创建Node*:
Node* node = new Node;
node->x = 0;
它工作得很好,不需要初始化它,那么为什么不按照我的方式做呢?我也不明白如何初始化一个结构。
另一个例子:
testMaze[0]->x == testMaze[1]->x //->Runtime error: Access violation reading error
testMaze[0]->x = 0; //->Runtime error: Access violation writing error
如何解决这些问题?谢谢。
【问题讨论】:
-
new Node * [mazeSize];提供了一个指针数组。您没有显示任何将这些指针指向任何有效位置的代码,并且警告消息表明您没有编写此类代码。指针会指向,所以解决方法是创建几个Nodes 并开始指向。 -
Note*不是Node。您有指针但没有Node指向。您可能打算使用new Node[mazesize]来实际创建Node对象,但您应该只使用std::vector<Node>。 -
@user4581301 啊,我想我现在明白了。我以为
new Node * [mazeSize];会给我指向这些指针创建和指向的节点的指针,但它实际上只生成指针,我必须自己创建节点并让这些指针指向这些节点。是这样吗? -
时髦。乐意效劳。现在看看您是否可以使用@FrançoisAndrieux 谈论的内容并杀死所有(可见)指针。指针几乎总是会减慢代码的速度,因为计算机不能只获取下一位数据,它必须使用指针来跟踪它然后加载它。但是,如果所有数据都在一条直线上,则计算机只是开始在后台加载内容,并且第二项可能已经准备好在您需要时使用,如果没有在加载第一项的同一读取中抓取。
-
不相关的咆哮:计算机很聪明,因为它们可以非常快地完成数量惊人的愚蠢事情。很多时候,让计算机变得愚蠢和快速所获得的收益比让计算机变得更智能所获得的收益更多。对于短期数据,O(N) 线性搜索比任何花哨的 O(log(N)) 搜索都要快得多,因为 CPU 可以直接运行 nope.nope.nope.nope.nope... 而没有就正确的路径或下一步要加载的数据做出任何决定。
标签: c++ pointers new-operator