繁体   English   中英

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

[英]Dynamically allocating and accessing memory from an array of pointers contained within a struct in C++

抱歉,您的标题太长了,但是...还是要说具体... 我正在设计一种算法,用于解决滑块益智游戏。 为此,我需要将游戏板的所有可能版本存储在节点中。 每个游戏板状态都存储在一个节点中,该节点还包含指向其父级(即,其当前状态之前的状态)及其所有子级(从其当前状态可用的所有可能状态)的指针。 这是我构建的节点结构:

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 ++教程。 我还尝试在“新节点”调用中省略“&top”; 没有帮助。 我只是看不到我的代码如何在内存访问中生成此错误。 我在这里也浏览了十几个答案,尽管没有一个答案适合我的情况。 我感到自己缺少明显的东西。 有什么帮助,即使只是重定向到我以某种方式忽略的有效答案? 提前致谢!

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

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

这里更大的问题是您的代码设计不良。 它非常类似于C,因为您使用了许多原始指针和数组,其中大小信息分开。 同样,跟踪这些指针的生存期的责任在于您,而不是自动发生。

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

您还可以封装char gameBoardState[5][4]; 放入一个可以在构造时任意设置大小的class GameBoard (与以前一样使用vector )。 这样做的另一个好处是,如果您决定使用不同的游戏板进行测试,则无需在各处更改代码。

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

numChildren从未初始化。 这意味着它具有一些垃圾值。 很有可能它是[0,9]以外的值,因此您正在访问不属于UB的内存,它将/可能导致内存访问错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM