Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从C+;中结构中包含的指针数组动态分配和访问内存+;_C++_Arrays_Pointers_Struct_Runtime Error - Fatal编程技术网

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 of
std::string
s,您的所有问题都会消失。哇,我真不敢相信我竟然忘记将构造函数中的参数值传递给struct属性!我知道这会是非常明显的事情;谢谢你指出这一点。如上所述,不敢相信我忽略了这么简单的事情。至于使用std::vector和std::string,这肯定是我将来至少应该考虑的事情。不过,就目前而言,与我一起工作的这个团队的一个关键问题是资源利用率。虽然我同意向量与阵列的性能损失在大多数情况下都不足以让人担心,但与我一起工作的其他人对此非常关注。不过,我非常欣赏详细的补充评论!:)@马尔卡瓦莫拉:很高兴能帮上忙。我会反击你的队友。过早优化是万恶之源,使用原始指针和c风格数组是过早优化。您会惊讶于
std::vector
在每个应用程序中的效果。
top.childArray[top.numChildren] = new node(sampleBoard2, &top);