这个C ++代码有什么问题?它在运行时崩溃

时间:2012-10-23 05:13:59

标签: c++ pointers nodes

我想知道以下C ++代码有什么问题。它在Run上崩溃了。

#include <iostream.h>
#include <conio.h>
using namespace std;

class node
{
    public:
        int info;
        node *addr;

        node(){
            info = 0;
            addr = NULL;          
        }

        ~node(){}
};

void func(node *);


int main(void){   
    node *head;
    node b;

    b.info = 10;

    *head = b;

    func(head); 
    getch();
}

void func(node *obj){
    cout<<"i: "<<(*obj).info;
}

6 个答案:

答案 0 :(得分:4)

*head = b;

不正确,因为head不指向任何内容

head = &b ;

应解决问题

答案 1 :(得分:1)

似乎问题出在

*head = b;

将其替换为

head = &b ;

答案 2 :(得分:0)

有一件事是你在这里声明了一个指针:

node *head;

然后在这里使用它:

 *head = b;

没有为head分配内存。

答案 3 :(得分:0)

*head = b;应改为head = &b;,假设您要将b的地址指定给指针head

坏版本编译但它会将对象b的副本分配给未初始化指针中包含的地址。

答案 4 :(得分:0)

其他人已经回答了你的写作任意记忆问题,但我想集中精力处理其他一些事情,例如:

#include <iostream.h>
#include <conio.h>

这有什么问题,你使用的是严重过时的编译器。 C ++标题不再包含.h,而conio.h严重违反标准且已老化。

我建议您首先更新到更新的环境。

此外,OO的一个基石是物体对自己的行为负责。代码到达对象内部以直接访问成员几乎永远是个好主意。

您应该提供适当的getter和setter,并且通常确保您班级中唯一的 public 内容是函数而不是数据。

换句话说,比如:

class node {
    public:
        node () {
            info = 0;
            addr = NULL;          
        }

        ~node() {
        }

        int getInfo() {
            return info;
        }
        void setInfo (int newInfo) {
            // Check newInfo for validity first.
            info = newInfo;
        }

        node *getAddr() {
            return addr;
        }
        void setAddr (node *newAddr) {
            // Check newAddr for validity first.
            addr = newAddr;
        }

    private:
        int info;
        node *addr;

};

答案 5 :(得分:0)

我看到两个问题:

  1. 您引用了未指定的指针*head

  2. 将堆栈变量存储在指针中。

  3. 我(和其他人一样)认为,当你说*head = b时,你的意思是head = &b。在第一种情况下,您引用节点指针并在其上分配节点值。这是一个错误,因为head变量尚未初始化,因此您需要在无效的内存地址之上复制完整的节点值。

    如果您使用head = &b替换,则会稍好一些,因为现在您将head指针设置为b的地址。但是现在你遇到了另一个错误,因为b是一个堆栈变量,指针只有在函数的生命周期内才有效。一旦函数完成,堆栈空间将被重用,head指针会在那里破坏任何东西。

    典型的解决方案是将head作为指向节点的指针,但也将b更改为指向节点的指针,并使用堆内存分配对其进行初始化,如b = (node *)malloc(sizeof(node);b = new node;。然后,您可以在*b中存储任何内容,最后将指针存储到一个寿命较长的变量,如heap=b;