#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>
#include <utility>
using namespace std;
struct node
{
int level = -1;
int value = -5;
node *left;
node *right;
};
int array[100][100];
void storetree(node *root, int val);
void printtree();
int main()
{
cout << " u there?" << endl;
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 100; j++)
{
array[i][j] = -5;
}
}
ifstream file1;
ifstream file2;
file1.open("tree1.txt");
file2.open("graph1.txt");
node root;
node *root1;
int val1;
int randval;
file1 >> val1;
root.level = 0;
root1->level = 0;
root.value = val1;
root1->value = val1;
array[0][0] = val1;
cout << "made it" << endl;
root1->left->value = -5; // <-- Error happens here
root1->right->value = -5;
root1->left->level = -5;
root1->right->level = -5;
所以当我访问root1-> left-> value时发生了我的错误,并且得到了堆栈转储错误。
是否无法以我编写的方式访问root1-> left-> value?通过打印语句,我推断出这是错误。我不太了解指针,将不胜感激。 :)
最佳答案
我在下面注释了您的源代码:
...
// Allocate an actual instance of your 'node' struct (local variable, on the stack)
node root;
// This allocates a POINTER variable, which just contains an address.
// The compiler knows that 'root1' will point at 'node' types.
// Note that you've only created a pointer variable here; NOT an actual node.
// Further, you haven't initialized it, so its value is "undefined"
// (you can't assume you know what its value is ... it could be anything).
node *root1;
...
// Set 'level' on the root node to zero
root.level = 0; // This is OK, because root is an actual 'node' struct instance
// Set 'level' ON THE NODE THAT 'root1' POINTS TO to zero
root1->level = 0; // This is not OK, because root1 is a wild (uninitialized) pointer
这是您的第一个问题。您创建了一个指针,但是没有指向任何指针。root1的值(它指向的地址)未定义
(可以为NULL,可以是该变量所在的内存中的任何值)
首先,优良作法是在定义局部变量时立即对其进行初始化。未初始化的变量可以具有未定义的值,并且可以为您的生活增加无数小时的调试时间,其中程序的每次运行都与上次运行有所不同。 eh
如果您在定义变量时还没有准备好分配实际值,
将其设置为某个已知值,例如0,
nullptr
等。这样,如果您忘记以后进行设置,则至少您的程序每次都会执行相同的错误操作。node *root1 = nullptr; // (...or maybe your compiler uses "NULL" or "(void *)0"...)
看起来您将基于从输入文件中读取的内容来构建节点树?如果是这样,那么几乎可以肯定,您将动态分配节点结构,因为您不知道提前需要多少。
// Allocate and initialize a new node struct (on the heap)
root1 = new node();
// Set 'level' ON THE NODE THAT 'root1' POINTS TO to zero
root1->level = 0; // Yay, now this works
变量“root1”现在包含新分配的“node”结构的地址。您的其余代码应从那里开始。提醒您,一个“正确的”程序(例如,不会泄漏内存的程序)最终应在对
delete
的调用返回的每个指针上调用new
。在构建动态分配的
node
对象树时,请记住这一点;完成后,您将需要对它们中的每一个调用delete
(root除外,您没有动态分配它)。