我想知道以下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;
}
答案 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)
我看到两个问题:
您引用了未指定的指针*head
将堆栈变量存储在指针中。
我(和其他人一样)认为,当你说*head = b
时,你的意思是head = &b
。在第一种情况下,您引用节点指针并在其上分配节点值。这是一个错误,因为head
变量尚未初始化,因此您需要在无效的内存地址之上复制完整的节点值。
如果您使用head = &b
替换,则会稍好一些,因为现在您将head
指针设置为b
的地址。但是现在你遇到了另一个错误,因为b
是一个堆栈变量,指针只有在函数的生命周期内才有效。一旦函数完成,堆栈空间将被重用,head
指针会在那里破坏任何东西。
典型的解决方案是将head
作为指向节点的指针,但也将b
更改为指向节点的指针,并使用堆内存分配对其进行初始化,如b = (node *)malloc(sizeof(node);
或b = new node;
。然后,您可以在*b
中存储任何内容,最后将指针存储到一个寿命较长的变量,如heap=b;
。