C++ 从C+;中结构中包含的指针数组动态分配和访问内存+;
很抱歉标题太长了,但是。。。它确实说要具体点。。。无论如何我正在做一个算法,用来解决滑动方块益智游戏。为此,我需要在节点中存储游戏板的所有可能变化。每个游戏板状态都存储在一个节点中,该节点还包含指向其父节点(即当前状态之前的状态)及其所有子节点(从当前状态可用的所有可能状态)的指针。以下是我构建的节点结构:C++ 从C+;中结构中包含的指针数组动态分配和访问内存+;,c++,arrays,pointers,struct,runtime-error,C++,Arrays,Pointers,Struct,Runtime Error,很抱歉标题太长了,但是。。。它确实说要具体点。。。无论如何我正在做一个算法,用来解决滑动方块益智游戏。为此,我需要在节点中存储游戏板的所有可能变化。每个游戏板状态都存储在一个节点中,该节点还包含指向其父节点(即当前状态之前的状态)及其所有子节点(从当前状态可用的所有可能状态)的指针。以下是我构建的节点结构: struct node { //Attributes char gameBoardState[5][4]; node* parent; int numChil
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];
}
}
}
};
struct节点
{
//属性
char gameBoardState[5][4];
节点*父节点;
国际儿童;
节点*childArray[10];
//建造师
节点(char-pGameState[][4],节点*pParent=NULL,int-pNumChildren=0,节点*pChildArray[]=NULL)
{
//每行我
对于(int i=0;i<5;i++)
{
//对于每列j
对于(int j=0;j<4;j++)
{
//将每个块设置为该值
gameBoardState[i][j]=pGameState[i][j];
}
}
}
};
我的问题在这里的这段代码中,纯粹是为了测试我是否能够正确地访问数据,比如(我已经设计了一些函数,这些函数实际上可以移动数据块,但还没有实现它们):
//样本板状态
字符样本板[5][4];
字符样本板2[5][4];
//样本字符
字符样本='a';
char sample2='z';
//初始化样本板
对于(int i=0;i<5;i++)
{
对于(int j=0;j<4;j++)
{
样本板[i][j]=样本;
样本板2[i][j]=样本2;
sample++;
样本2--;
}
}
//试验
这个问题其实很简单,你从来没有初始化过numChildren
因此,试图说top.childArray[top.numChildren]…
很可能会导致numChildren
计算出一些可笑的(可能是负数)数字
这里更大的问题是您的代码设计糟糕。这很像C语言,因为您使用了大量原始指针和数组,其中大小信息是独立的。此外,跟踪这些指针的生命周期的责任在您身上,而不是自动发生
我建议您考虑使用and重构代码,and提供索引操作以及.size()
,这样您的代码将更加安全
您可以另外封装chargameboardstate[5][4]将>编码为类游戏板
,可在构建时任意调整大小(如前所述使用向量
)。如果您决定使用不同的游戏板进行测试,则无需到处更改代码,这是一个额外的好处。
top.childArray[top.numChildren] = new node(sampleBoard2, &top);
numChildren
从未初始化。这意味着它有一些垃圾值。很可能是[0,9]之外的值,因此您正在访问您不拥有的UB内存,这将/可能导致内存访问错误。停止使用数组数组,切换到std::vector
s ofstd::string
s,您的所有问题都会消失。哇,我真不敢相信我竟然忘记将构造函数中的参数值传递给struct属性!我知道这会是非常明显的事情;谢谢你指出这一点。如上所述,不敢相信我忽略了这么简单的事情。至于使用std::vector和std::string,这肯定是我将来至少应该考虑的事情。不过,就目前而言,与我一起工作的这个团队的一个关键问题是资源利用率。虽然我同意向量与阵列的性能损失在大多数情况下都不足以让人担心,但与我一起工作的其他人对此非常关注。不过,我非常欣赏详细的补充评论!:)@马尔卡瓦莫拉:很高兴能帮上忙。我会反击你的队友。过早优化是万恶之源,使用原始指针和c风格数组是过早优化。您会惊讶于std::vector
在每个应用程序中的效果。
top.childArray[top.numChildren] = new node(sampleBoard2, &top);