从C ++中的结构中包含的指针数组动态分配和访问内存

时间:2016-02-01 18:51:15

标签: c++ arrays pointers struct runtime-error

对于这个超级冗长的标题感到抱歉,但是...它说具体是......反正!我正在制作一个旨在解决滑块拼图游戏的算法。为此,我需要在节点中存储游戏板的所有可能变体。每个游戏板状态存储在一个节点内,该节点还包含指向其父节点的指针(即,在其当前状态之前的状态)及其所有子节点(从其当前状态可用的所有可能状态)。这是我构建的节点结构:

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";

无论出于何种原因,ERROR注释之间的行都会产生内存访问错误。我已经查看了有关指针,数组,结构及其组合的各种C ++教程。我也试过省略&#34;&amp; top&#34;在&#34;新节点&#34;呼叫;没有帮助。我只是没有看到我的代码在内存访问中如何生成此错误。我在这里也看了十几个答案,但没有一个解决方案似乎适用于我的情况。我感觉我错过了一些相当明显的东西。任何帮助,即使它只是重定向到我忽略的有效答案?提前谢谢!

2 个答案:

答案 0 :(得分:0)

问题实际上很简单,你从未初始化numChildren

因此,试图说top.childArray[top.numChildren] ...可能会导致numChildren评估一些荒谬(可能是否定的)数字。

这里更大的问题是您的代码设计不佳。它非常像C,因为您使用了大量原始指针和数组,其中大小调整信息是分开的。此外,跟踪这些指针的生命周期的责任在于您,而不是自动发生。

我建议您考虑使用std::vectorstd::string重构代码,它们提供索引操作以及.size(),您的代码将变得更加安全。

您还可以将char gameBoardState[5][4];封装到class GameBoard中,vector可以在构造时任意调整大小(使用{{1}},如前所述)。如果您决定使用不同的游戏板进行测试,这还有一个额外的好处,就是您无需在整个地方更改代码。

答案 1 :(得分:0)

top.childArray[top.numChildren] = new node(sampleBoard2, &top);

numChildren从未初始化。这意味着它有一些垃圾价值。很可能它是一个超出[0,9]的值,因此您访问的是您不拥有的内存,这是UB,并且/会导致内存访问错误。