c++;通过函数传递自定义结构 我已经用C++程序工作了一段时间,我已经知道到底发生了什么,但我还没弄清楚如何精确地修复它。以下是我的设置: struct entry { string foo; string bar; string num; }; struct node { entry input; node* left; node* right; }; node* home = new node;
此代码发生在包含在主cpp文件中的单独头文件中,该文件具有以下内容:c++;通过函数传递自定义结构 我已经用C++程序工作了一段时间,我已经知道到底发生了什么,但我还没弄清楚如何精确地修复它。以下是我的设置: struct entry { string foo; string bar; string num; }; struct node { entry input; node* left; node* right; }; node* home = new node;,c++,pointers,struct,initialization,heap-memory,C++,Pointers,Struct,Initialization,Heap Memory,此代码发生在包含在主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)
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);
}
void printAll(节点*开始){
if(start==NULL)返回;
全部打印(开始->左);
cout-input.foo;
printall(开始->右侧);
}
Visual Studio给我的错误是启动时的
0xcdcd
。我知道引起问题的不是home
,而是start
,但我不知道如何更正此错误。我四处阅读,可以假设start
已被抛出到堆内存中,但它未激活。我认为这是不可能的。我也可以猜到C++不知道什么是代码>开始/代码>是如何使用的,我如何纠正这个错误? < p>你还没有初始化<代码>左<代码>或<代码>右<代码>。在调试版本中,Visual Studio将未初始化内存设置为0xcdcdcd
。这显然不等于NULL
,因此您的比较返回false
,如另一个答案中所述,您得到的错误可能是因为您没有将左右节点初始化为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和其余部分公开 在私人之上
- 您还需要一个函数将节点添加到列表中。查找链表属性和方法,查看您还需要什么
- 最好避免使用结构并使用对象来代替它们
start
指向什么,都是动态分配的,尽管msvc++确实有堆的概念。无论如何,解决单元化内存问题的典型方法是提供一个c'tor,类似于node():left(),right(){}
或node():left(nullptr),right(nullptr){}
。使用构造函数初始化会导致性能损失,但对于列表节点可能不应考虑这一点。^这意味着printAll函数会无限地调用自身。@TamaMcGlinn不,这意味着调用了未定义的行为。请注意,op的侵入性较小的修复方法是删除printAll(开始->左);
。和“最好避免使用结构并使用对象代替结构”实际上没有任何意义,struct
s的实例是对象,class
s或多或少与struct
s相同。只是struct
的默认访问修饰符和继承模式是public
。它们的声明/定义不能合并,即class a;st结构A{};
无效,而结构A;结构A{};合法。