Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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++程序工作了一段时间,我已经知道到底发生了什么,但我还没弄清楚如何精确地修复它。以下是我的设置: 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 - Fatal编程技术网

c++;通过函数传递自定义结构 我已经用C++程序工作了一段时间,我已经知道到底发生了什么,但我还没弄清楚如何精确地修复它。以下是我的设置: struct entry { string foo; string bar; string num; }; struct node { entry input; node* left; node* right; }; node* home = new node;

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)

此代码发生在包含在主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);
}
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和其余部分公开 在私人之上

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

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


你不应该把“新”放在任何地方。相应的删除在哪里?还有确保始终调用此函数的代码,即使在异常情况下也是如此?使用std::unique_ptr为您处理这个问题。“我四处阅读,我可以假设start已经被抛出到堆内存中,但它没有激活。我认为这是不可能的。”从形式上讲,无论
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{};合法。