C ++通过函数传递自定义结构

时间:2018-10-13 22:25:12

标签: c++ pointers struct initialization heap-memory

我使用这个C ++程序已经有一段时间了,我已经知道发生了什么,但是我还没有弄清楚如何正确地解决它。这是我设置的:

struct entry {
    string foo;
    string bar;
    string num;
};
struct node {
    entry input;
    node* left;
    node* right;
};
node* home = new node;

此代码在单独的头文件中进行,该头文件包含在主cpp文件中,该文件具有以下内容:

home->input.foo="John";
home->input.bar="Doe";
home->input.name="1234";
printAll(home);

这是弹出错误并试图通过头文件中的函数printAll传递的原因:

void printAll(node* start){
    if(start==NULL) return;
    printAll(start->left);
    cout << start->input.foo;
    printall(start->right);
}

Visual Studio给我的错误是0xCDCDCDCD on start。我知道不是home引起此问题,而是start,但我不知道如何解决此错误。我四处阅读,我可以假设start已被扔到堆内存中,但是没有安装。我认为这是不可能的。而且我还可以猜测C ++不知道start是什么以及如何使用它,我将如何纠正呢?

2 个答案:

答案 0 :(得分:1)

您尚未初始化leftright。在调试版本中,Visual Studio会将未初始化的内存设置为0xCDCDCDCD。显然这不等于NULL,因此您的比较返回false

答案 1 :(得分:0)

如另一个答案中所述,您收到的错误可能是因为您尚未将左右节点初始化为NULL。但是,您还有另一个错误,那就是您在printAll中创建了一个无限循环。

您的printAll函数将首先移至最左侧的节点并进行打印。之后,它将向右移动一个节点,并且在打印任何节点之前,它将再次向左移动。

打印所有节点的正确方法是将节点列表放在跟踪第一个和最后一个节点的类中。

Class LList {
    node * startNode;

    void printAll(){
          if (startNode == NULL) 
                return;

          node * currNode = startNode;

         // print all the nodes moving left to right
         _printAll(currNode);
    }

    void _printAll(currNode){
          // print currNode and recursively go to next by calling 
          // _printAll(currNode->right)
     }
}

其他注意事项

  • 当然,您需要将printAll公开,其余的 高于私人。

  • 您还需要一个函数来将节点添加到列表中。查找链接列表的属性和方法,以了解您还需要什么。

  • 最好避免使用结构并使用对象代替它们