首页 新闻 会员 周边 捐助

C/C++指针问题

0
悬赏园豆:5 [已解决问题] 解决于 2015-03-31 13:50

Node *p;

Node *q=0;

Node *t=new Node;

Node *k=(Node*)malloc(sizeof(NOde));

未初始化的指针,空指针有什么区别?为什么直接给他们赋值运行会卡死?

为什么new 一个就可以赋值,new 和 malloc 有什么区别?

这是我的Node

struct Node
{
  int data;
  Node *next;
};

Node *p=(Node*)malloc(sizeof(Node));
p->data=5;        //此处p不初始化,或赋为空就会卡死

薛晓东的主页 薛晓东 | 初学一级 | 园豆:194
提问于:2015-03-31 11:54
< >
分享
最佳答案
1

未初始化的指针是指有具体内存地址,但是数据内容为空(未初始化)

空指针是指没有具体内存地址的指针(地址为0)

从你的代码来看,是说nod *p  是定义一个未初始化指针?其实等同于 node * p=0;

new一个指针后,就是创建了一个对象实例。

malloc只是分配一块内存空间,但是,内存空间内的数据是空的(即未初始化)。

收获园豆:5
519740105 | 大侠五级 |园豆:5810 | 2015-03-31 12:41

哦,那没有具体内存地址所以就不能直接赋值了?

原来node * p和node * p=0是一样的啊,

new 完创建的实例比如这个Node 结构体,那他的实例默认值是产生的随机数吗?

意思只要它有了内存地址就可以赋值了?

薛晓东 | 园豆:194 (初学一级) | 2015-03-31 12:56

@薛晓东:

1、所谓指针,其实就是一个内存地址,是一个整数,整数的默认值是0,C里有NULL宏定义

2、new一个对象后,会为这个对象分配内存空间,有了内存空间,就能对成员进行操作了。具体的new后的默认值是多少,由new执行的构造函数以及成员的类型确定

3、malloc是分配内存空间,跟new的效果类似,但根本的不同是:new要执行某个构造函数,该构造可能会进行必要的初始化,而malloc只是分配内存空间,既不会执行构造函数,更不会初始化内存空间。

4、所谓初始化内存空间,指的是对新分配的内存进行初始处理,使得各成员对象有最初始的数值。new会执行初始化,malloc不会,表现为:malloc分配的内存空间可能之前被别的应用使用过的(回收的内存空间),此时的内存空间可能有垃圾数据,直接使用就可能会产生意外。

519740105 | 园豆:5810 (大侠五级) | 2015-03-31 13:46

@519740105: 我亲哥呀,这么详细,谢啦~~

薛晓东 | 园豆:194 (初学一级) | 2015-03-31 13:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册