内存不能为read!指针问题!帮忙~感激不尽
小弟正在学习指针,刚才编了个小程序验证学到的知识。但是编译没错,运行时出错,说某块内存不能为read! 请问我的指针出了什么问题,怎样改?
#include<iostream.h>
class std
{
private:
struct DATA
{
int ID;
DATA *pnext;
};
public:
void ADD(int&);
void SHOW();
DATA *phead,*p;
};
void std::ADD(int &a)
{
DATA *pnow=new DATA;
pnow->ID=a;
if(phead==NULL)
{
phead=pnow;
p=pnow;
pnow->pnext=NULL;
}
else
{
p->pnext=pnow;
p=pnow;
pnow->pnext=NULL;
}
cout<<"SUCCESSFUL!!!"<<endl;
}
void std::SHOW()
{
DATA *ptemp;
ptemp=phead;
while(ptemp->pnext!=NULL)
{
cout<<ptemp->ID;
ptemp=ptemp->pnext;
}
cout<<ptemp->ID<<endl;
}
void main(void)
{
std q;
int a;
for(int i=0;i<6;i++)
{
cout<<"INPUT_ID:"<<endl;
cin>>a;
q.ADD(a);
}
q.SHOW();
}
问题点数:30、回复次数:9Top
1 楼ken4qq(ken)回复于 2006-02-20 10:44:20 得分 0
帮帮忙啊::::::Top
2 楼iamcaicainiao(老菜,长征)回复于 2006-02-20 10:51:57 得分 6
你没有构造函数。
建议这样。
class std
{
private:
struct DATA
{
int ID;
DATA *pnext;
};
public:
std();
void ADD(int&);
void SHOW();
DATA *phead,*p;
};
std::std()
{
phead = NULL;
}Top
3 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-02-20 10:52:32 得分 1
void std1::ADD(int &a)中 p->pnext=pnow;//p没有初始化Top
4 楼iamcaicainiao(老菜,长征)回复于 2006-02-20 10:53:23 得分 0
你没有构造 函数。
if(phead==NULL)
{
phead=pnow;
p=pnow;
pnow->pnext=NULL;
}
else
{
p->pnext=pnow;
p=pnow;
pnow->pnext=NULL;
}
这个是有问题的呀。你的phead一开始并不指向NULL,而是随机指的,于是就出了问题。就是你没有初始化它Top
5 楼iamcaicainiao(老菜,长征)回复于 2006-02-20 10:55:47 得分 0
河马说的也是问题哦。
俩个你一个都没有初始化。对于变量,尤其指针,这是8好的习惯,呵呵。Top
6 楼Michael_555(Nothing)回复于 2006-02-20 11:00:09 得分 2
指针没被初始化就是用了。
if(phead==NULL)//phead没有初始化为NULL,肯定不会等于NULL的。
{
phead=pnow;
p=pnow;
pnow->pnext=NULL;
}
else
{
p->pnext=pnow;
p=pnow;
pnow->pnext=NULL;
}
Top
7 楼Mybox(卡卡西)回复于 2006-02-20 11:12:45 得分 1
必须在构造函数里先初试化指针.Top
8 楼ugg(逸学堂(exuetang.net))回复于 2006-02-20 11:20:24 得分 20
以下程序通过VC7.0测试
结果正确
#include "stdafx.h"
#include <fstream>
using namespace::std;
struct DATA// 结构体拿到外边。
{
int ID;
DATA *pnext;
};
class std1 // 使用命名空间std,定义类std就会有问题,所以修改成为std1
{
public:
std1() // 定义构造函数,初始化指针
{
phead = NULL;
p = NULL;
}
~std1()// 清除结构体数据
{
while(phead != NULL)
{
DATA *pTemp;
while(phead != NULL)
{
pTemp = phead;
phead = phead->pnext;
free(pTemp);
}
phead = NULL;
p = NULL;
}
}
void ADD(int&);
void SHOW();
private:
DATA *phead,*p;// 结构体指针定义为private,实现封装特性。
};
void std1::ADD(int &a)
{
DATA *pnow=new DATA;
pnow->ID=a;
if(phead==NULL)
{
phead=pnow;
p=pnow;
pnow->pnext=NULL;
}
else
{
p->pnext=pnow;
p=pnow;
pnow->pnext=NULL;
}
cout<<"SUCCESSFUL!!!"<<endl;
}
void std1::SHOW()
{
DATA *ptemp;
ptemp=phead;
while(ptemp->pnext!=NULL)
{
cout << ptemp->ID << endl;
ptemp=ptemp->pnext;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
std1 q;
int a;
for(int i=0;i<6;i++)
{
cout<<"INPUT_ID:"<<endl;
cin>>a;
q.ADD(a);
}
q.SHOW();
system("pause");
return 0;
}
Top
9 楼ken4qq(ken)回复于 2006-02-20 11:23:23 得分 0
嗯!多谢大家帮忙!原来是没有初始化头指针!Top




