从 C++ 结构中包含的指针数组动态分配和访问内存
Dynamically allocating and accessing memory from an array of pointers contained within a struct in C++
抱歉 super-lengthy 标题,但是......它确实说得具体......无论如何!我正在制作一种旨在解决 sliding-block 益智游戏的算法。为此,我需要在节点中存储游戏板的所有可能变体。每个游戏板状态都存储在一个节点中,该节点还包含指向其 parent(即其当前状态之前的状态)及其所有 children(从其当前状态可用的所有可能状态)的指针。这是我构建的节点结构:
struct node
{
//Attributes
char gameBoardState[5][4];
node* parent;
int numChildren;
node* childArray[10];
//Constructor
node(char pGameState[][4], node* pParent = NULL, int pNumChildren = 0, node* pChildArray[] = NULL)
{
//For each row i
for (int i = 0; i < 5; i++)
{
//For each column j
for (int j = 0; j < 4; j++)
{
//Set each block equal to this
gameBoardState[i][j] = pGameState[i][j];
}
}
}
};
我的问题出在这部分代码中,纯粹是为了测试我是否可以正确访问数据等而设计的(我已经设计了实际移动这些部分的功能,但尚未实现它们):
//Sample board state
char sampleBoard[5][4];
char sampleBoard2[5][4];
//Sample character
char sample = 'a';
char sample2 = 'z';
//Initialize the sample board
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 4; j++)
{
sampleBoard[i][j] = sample;
sampleBoard2[i][j] = sample2;
sample++;
sample2--;
}
}
//Test
cout << "\n\nERROR BEGINS\n\n";
//Create first node
node top = node(sampleBoard);
//Create a child node
top.childArray[top.numChildren] = new node(sampleBoard2, &top);
//Test
cout << "\n\nERROR ENDS\n\n";
无论出于何种原因,错误注释之间的行都会产生内存访问错误。我看过各种关于指针、数组、结构及其组合的 C++ 教程。我还尝试在 "new node" 调用中省略“&top”;没有帮助。我只是没有看到我的代码是如何在内存访问中产生这个错误的。我还在这里查看了十几个答案,尽管其中 none 的解决方案似乎适用于我的情况。我觉得我错过了一些相当明显的东西。任何帮助,即使它只是重定向到我不知何故忽略的有效答案?提前致谢!
问题其实很简单,你没有初始化numChildren
。
因此,尝试说 top.childArray[top.numChildren] ...
可能会导致 numChildren
计算出一些荒谬的(可能是负数)数字。
这里更大的问题是您的代码设计不当。它非常类似于 C,因为您使用了很多原始指针和数组,其中大小信息是分开的。此外,跟踪这些指针的生命周期的责任在你身上,而不是自动发生。
我建议您考虑使用 std::vector
and std::string
重构您的代码,它提供索引操作以及 .size()
,您的代码将变得更加安全。
您还可以将 char gameBoardState[5][4];
封装到可以在构建时任意大小的 class GameBoard
(像以前一样使用 vector
)。这样做的额外好处是,如果您决定使用不同的游戏板进行测试,则无需到处更改代码。
在
top.childArray[top.numChildren] = new node(sampleBoard2, &top);
numChildren
从未初始化。这意味着它有一些垃圾价值。它很可能是 [0, 9] 之外的值,因此您正在访问不属于您的内存,即 UB 并且 will/can 会导致内存访问错误。
抱歉 super-lengthy 标题,但是......它确实说得具体......无论如何!我正在制作一种旨在解决 sliding-block 益智游戏的算法。为此,我需要在节点中存储游戏板的所有可能变体。每个游戏板状态都存储在一个节点中,该节点还包含指向其 parent(即其当前状态之前的状态)及其所有 children(从其当前状态可用的所有可能状态)的指针。这是我构建的节点结构:
struct node
{
//Attributes
char gameBoardState[5][4];
node* parent;
int numChildren;
node* childArray[10];
//Constructor
node(char pGameState[][4], node* pParent = NULL, int pNumChildren = 0, node* pChildArray[] = NULL)
{
//For each row i
for (int i = 0; i < 5; i++)
{
//For each column j
for (int j = 0; j < 4; j++)
{
//Set each block equal to this
gameBoardState[i][j] = pGameState[i][j];
}
}
}
};
我的问题出在这部分代码中,纯粹是为了测试我是否可以正确访问数据等而设计的(我已经设计了实际移动这些部分的功能,但尚未实现它们):
//Sample board state
char sampleBoard[5][4];
char sampleBoard2[5][4];
//Sample character
char sample = 'a';
char sample2 = 'z';
//Initialize the sample board
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 4; j++)
{
sampleBoard[i][j] = sample;
sampleBoard2[i][j] = sample2;
sample++;
sample2--;
}
}
//Test
cout << "\n\nERROR BEGINS\n\n";
//Create first node
node top = node(sampleBoard);
//Create a child node
top.childArray[top.numChildren] = new node(sampleBoard2, &top);
//Test
cout << "\n\nERROR ENDS\n\n";
无论出于何种原因,错误注释之间的行都会产生内存访问错误。我看过各种关于指针、数组、结构及其组合的 C++ 教程。我还尝试在 "new node" 调用中省略“&top”;没有帮助。我只是没有看到我的代码是如何在内存访问中产生这个错误的。我还在这里查看了十几个答案,尽管其中 none 的解决方案似乎适用于我的情况。我觉得我错过了一些相当明显的东西。任何帮助,即使它只是重定向到我不知何故忽略的有效答案?提前致谢!
问题其实很简单,你没有初始化numChildren
。
因此,尝试说 top.childArray[top.numChildren] ...
可能会导致 numChildren
计算出一些荒谬的(可能是负数)数字。
这里更大的问题是您的代码设计不当。它非常类似于 C,因为您使用了很多原始指针和数组,其中大小信息是分开的。此外,跟踪这些指针的生命周期的责任在你身上,而不是自动发生。
我建议您考虑使用 std::vector
and std::string
重构您的代码,它提供索引操作以及 .size()
,您的代码将变得更加安全。
您还可以将 char gameBoardState[5][4];
封装到可以在构建时任意大小的 class GameBoard
(像以前一样使用 vector
)。这样做的额外好处是,如果您决定使用不同的游戏板进行测试,则无需到处更改代码。
在
top.childArray[top.numChildren] = new node(sampleBoard2, &top);
numChildren
从未初始化。这意味着它有一些垃圾价值。它很可能是 [0, 9] 之外的值,因此您正在访问不属于您的内存,即 UB 并且 will/can 会导致内存访问错误。