0

我想知道以下 C++ 代码有什么问题。它在运行时崩溃。

#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;
}
4

6 回答 6

4
*head = b;

不正确,因为 head 没有指向任何东西

head = &b ;

应该解决问题

于 2012-10-23T05:18:39.827 回答
1

看来问题出在

*head = b;

将其替换为

head = &b ;
于 2012-10-23T08:41:25.427 回答
0

错误的一件事是您在这里声明了一个指针:

node *head;

然后在这里使用它:

 *head = b;

不为head.

于 2012-10-23T05:16:45.457 回答
0

该行*head = b;应该改为head = &b;,假设您想将地址分配给b指针head

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

于 2012-10-23T05:20:59.167 回答
0

其他人已经回答了您写入任意内存的问题,但我想专注于其他一些事情,例如:

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

这有什么问题是您使用的编译器严重过时。C++ 头文件不再具有.h它们,并且conio.h严重不标准且老化。

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

此外,OO 的基石之一是对象对自己的行为负责。让代码直接访问对象内部几乎从来都不是一个好主意。

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

换句话说,类似:

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;

};
于 2012-10-23T05:26:56.363 回答
0

我看到两个问题:

  1. 你引用了一个未初始化的指针 *head

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

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

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

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

于 2012-10-23T05:34:12.540 回答