为什么没输出呢,难道空指针不能指向某个数据吗

sysabod 2008-12-13 11:33:51
#include <iostream>
using namespace std;
struct Node
{Node(int i)
{data=i;}
int data;
Node* left;
};
typedef struct Node* Nptr;
int main()
{Nptr p=NULL;
struct Node n(67);
p->data=9;
p->left=&n;
cout<<p->data
<<endl<<p->left->data;

}
我用vs 2008编译运行,什么也没有输出,请问这是为什么呢,空指针p指向的数据是9啊,为什么?
...全文
161 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
netclose 2008-12-15
  • 打赏
  • 举报
回复
mark
qap22 2008-12-15
  • 打赏
  • 举报
回复
mark
liyudefly 2008-12-15
  • 打赏
  • 举报
回复
具体解释就涉及到底层和一些汇编的东西了,记住就行,现在的VC/c是32位的语言,所的地址都是由4个字节组成,像int *p,char *p,char (*p)[100],等等,你用sizeof(p)求他都是4,可能有些东西不是那么好理解的,先记下,慢慢就能通的。
lann64 2008-12-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 sysabod 的帖子:]
#include <iostream>
using namespace std;
struct Node
{Node(int i)
{data=i;}
int data;
Node* left;
};
typedef struct Node* Nptr;
int main()
{Nptr p=NULL;
struct Node n(67);
p->data=9;
p->left=&n;
cout < <p->data
< <endl < <p->left->data;

}
我用vs 2008编译运行,什么也没有输出,请问这是为什么呢,空指针p指向的数据是9啊,为什么?
[/Quote]
不止是没有输出吧,应该出运行错。

实际上,你是把地址0开始的内存当作Node结构存取了,而那个地址应该是操作系统使用的,禁止用户程序访问的地址。
如果编译器做一些保护处理,可能忽略它,更好的方式是抛出异常。
codejian 2008-12-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nullah 的回复:]
你的p没指向任何一块内存
然后你又想给*p的data赋值
这样肯定要出错的
[/Quote]
赞同哦
codejian 2008-12-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nullah 的回复:]
你的p没指向任何一块内存
然后你又想给*p的data赋值
这样肯定要出错的
[/Quote]
赞同哦
  • 打赏
  • 举报
回复
又是这种不分配内存直接拿了指针就赋值的人。。像以前的我。。
sysabod 2008-12-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyu637 的回复:]
#include <iostream>
using namespace std;
struct Node
{Node(int i)
{data=i;}
Node()
{

}
int data;
Node* left;
};
typedef struct Node* Nptr;
int main()
{
Nptr p=new Node;
struct Node n(67);

p->data=9;
p->left=&n;
cout < <p->data
< <endl < <p->left->data;


delete p;
}
[/Quote]
但是我编译都没错啊
SearchLife 2008-12-14
  • 打赏
  • 举报
回复
p是一个空指针,你要分配出一个对象的内存空间以后,才可以给它赋值

---------
up
nullah 2008-12-14
  • 打赏
  • 举报
回复
你的p没指向任何一块内存
然后你又想给*p的data赋值
这样肯定要出错的
sysabod 2008-12-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 liyudefly 的回复:]
居然不自动换行,我把上面注释重发下。。
/*p是一个Node*型的指针,它只占4个字节(32位)内存,这4个字节只能存一个Node型的地址,这就好比一个门牌号码,这个门牌号码本身不是一户人家,
它只是一个人家的地址,如果要想这个门牌代表一户人家,那就是挂到人家门口上,你的P=NULL,就意味着,门牌号码本身已经做好了,比方说某街100号,
但是你没挂那去,就放在生产这个门牌号码的地方,你能在这个号码的地方找到这户人家吗?…
[/Quote]
你好,为什么p占4个字节(32位)内存?
wap21 2008-12-14
  • 打赏
  • 举报
回复
不懂,帮顶
SeanHwang 2008-12-14
  • 打赏
  • 举报
回复
P只是个指针,没有实际的对象,你怎么能把值赋上去呢?
xuruichen 2008-12-14
  • 打赏
  • 举报
回复
你的p没指向任何一块内存
然后你又想给*p的data赋值
这样肯定要出错的

赞同,

用new创建动态对象,给指针分配内存,


赞同,

引用需要赋初值,但是指针没有硬性规定,不给赋初值就好了,给个NULL?
liyudefly 2008-12-14
  • 打赏
  • 举报
回复
居然不自动换行,我把上面注释重发下。。
/*p是一个Node*型的指针,它只占4个字节(32位)内存,这4个字节只能存一个Node型的地址,这就好比一个门牌号码,这个门牌号码本身不是一户人家,
它只是一个人家的地址,如果要想这个门牌代表一户人家,那就是挂到人家门口上,你的P=NULL,就意味着,门牌号码本身已经做好了,比方说某街100号,
但是你没挂那去,就放在生产这个门牌号码的地方,你能在这个号码的地方找到这户人家吗?p=new Node;就相当于把门牌号码挂人家门口上,这就可以了。
这样应该够清楚了吧*/
liyudefly 2008-12-14
  • 打赏
  • 举报
回复
#include <iostream> 
using namespace std;
struct Node
{
Node(int i)
{
data=i;
}
int data;
Node* left;
};
typedef struct Node* Nptr;
int main()
{
Nptr p=NULL; /*p是一个Node*型的指针,它只占4个字节(32位)内存,这4个字节只能存一个Node型的地址,这就好比一个门牌号码,这个门牌号码本身不是一户人家,它只是一个人家的地址,如果要想这个门牌代表一户人家,那就是挂到人家门口上,你的P=NULL,就意味着,门牌号码本身已经做好了,比方说某街100号,但是你没挂那去,就放在生产这个门牌号码的地方,你能在这个号码的地方找到这户人家吗?p=new Node;就相当于把门牌号码挂人家门口上,这就可以了。这样应该够清楚了吧*/
struct Node n(67);
p->data=9;
p->left=&n;
cout < <p->data
< <endl < <p->left->data;

}
fiyaa 2008-12-14
  • 打赏
  • 举报
回复
应该用NEW给指针分配内存,赞同
lq651659889 2008-12-14
  • 打赏
  • 举报
回复
up
lingling1989r 2008-12-14
  • 打赏
  • 举报
回复
我也犯过类似的错,你声明了这个类型的指针,你得让它指向个东西才行啊。这个东西就是你new分配出来的东西,才能用你这个指针操作它。

顺便举个new的例子:

class node
{
int data;
node *next;
..
};
class nodelist
{
node *head;
public:
nodelist();//讲你的head指针指向一个没数据的node
void create();
};

void nodelist::create()
{
node *p;int cur;
cout<<"input the data\n";
cin>>cur;
p=new node;
p->next=head->next;
p->data=cur;
head->next=p;
}

zhaohongbo83 2008-12-14
  • 打赏
  • 举报
回复
p是一个空指针,你要分配出一个对象的内存空间以后,才可以给它赋值
up
加载更多回复(2)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧