主题:问一个数组传参的问题
恍若初年の
[专家分:0] 发布于 2010-04-21 10:55:00
不是很理解啊,试着output自定义数据都是对的,但是把数组中某个值赋给方法里的一个量就出现访问不允许错误。。。。。
数组传的内存地址有访问限制么??
全代码附件里
具体相关代码如下。。。
typedef struct Student //学生数据类型
{
string Name;
int StudentID;
int Grade[CourseNumber];
int AverageGrade;
}Student;
void insert (StudentList &L,Student &S) //在学生链表尾部插入以S为学生数据的学生节点
{
StudentNode *p,*d;
d=(StudentNode*)malloc(sizeof(StudentNode*));
p=L.head->former; //找到链表的尾端,双循环表
d->data=S; //d为被传的量,S即传值的量,这里进行不下去,访问失败了,试过一个一个基本数据赋值也不行。。
d->former=p;
d->next=L.head;
p->former->next=d;
L.head->former=d;
}
int main()
{
int n;
cout<<"How many students' data will be inputted(the number should below 100)?";
cin>>n; //学生个数
Student student[Max_Student_Number];
for(int i=0;i<n;i++)
init(student[i]); //初始化学生
StudentList L;
init(L); //双向表初始化
for(int j=0;j<n;j++)
insert(L,student[j]); //一个一个插入学生数据
最后更新于:2010-04-21 21:50:00
回复列表 (共17个回复)
11 楼
雪光风剑 [专家分:27190] 发布于 2010-04-21 21:33:00
想问问你的代码怎么能够运行的
init(student[i]); 初始化学生的时候传参类型根本不对啊
12 楼
恍若初年の [专家分:0] 发布于 2010-04-21 21:40:00
饿、。真是不好意思。。我改了后来= =还是不行~结果原文件没存。。上传的附件没改。。不过改了也不行= =~囧我才发现~~
内存错误变成了
bool _Grow(size_type _N, bool _Trim = false)
{if (max_size() < _N)
_Xlen();
if (_Ptr != 0
&& _Refcnt(_Ptr) != 0 && _Refcnt(_Ptr) != _FROZEN)
if (_N == 0)
{--_Refcnt(_Ptr), _Tidy();
return (false); }
else
{_Copy(_N);
return (true); }
if (_N == 0)
{if (_Trim)
_Tidy(true);
else if (_Ptr != 0)
_Eos(0);
return (false); }
else
{if (_Trim && (_MIN_SIZE < _Res || _Res < _N))
{_Tidy(true);
_Copy(_N); }
else if (!_Trim && _Res < _N)
_Copy(_N);
return (true); }}
static const _E * __cdecl _Nullstr()
{static const _E _C = _E(0);
return (&_C); }
static size_type _Pdif(const_pointer _P2, const_pointer _P1)
{return (_P2 == 0 ? 0 : _P2 - _P1); }
static const_pointer _Psum(const_pointer _P, size_type _N)
{return (_P == 0 ? 0 : _P + _N); }
static pointer _Psum(pointer _P, size_type _N)
{return (_P == 0 ? 0 : _P + _N); }
unsigned char& _Refcnt(const _E *_U)
{return (((unsigned char *)_U)[-1]); }
void _Split()
{if (_Ptr != 0 && _Refcnt(_Ptr) != 0 && _Refcnt(_Ptr) != _FROZEN)
{_E *_Temp = _Ptr;
_Tidy(true);
assign(_Temp); }}
void _Tidy(bool _Built = false)
{if (!_Built || _Ptr == 0)
;
这。。。 else if (_Refcnt(_Ptr) == 0 || _Refcnt(_Ptr) == _FROZEN)
allocator.deallocate(_Ptr - 1, _Res + 2);
else
--_Refcnt(_Ptr);
_Ptr = 0, _Len = 0, _Res = 0; }
_E *_Ptr;
size_type _Len, _Res;
};
13 楼
雪光风剑 [专家分:27190] 发布于 2010-04-21 21:43:00
贴一下你改过的student初始化吧,目前没法测试你的代码
14 楼
恍若初年の [专家分:0] 发布于 2010-04-21 21:50:00
恩恩,送到附件里了,错误信息
15 楼
恍若初年の [专家分:0] 发布于 2010-04-21 21:53:00
void init(Student &s) //学生数据的初始化
{
cout<<"Enter his/her name ";
cin>>s.Name;
cout<<"Enter his/her student's ID ";
cin>>s.StudentID;
cout<<"Enter his/her course grade ";
cin>>s.Grade[0]>>s.Grade[1]>>s.Grade[2]>>s.Grade[3]>>s.Grade[4];
s.AverageGrade=(s.Grade[0]+s.Grade[1]+s.Grade[2]+s.Grade[3]+s.Grade[4])/5;
}
16 楼
tr0217 [专家分:730] 发布于 2010-04-23 12:12:00
[quote]1楼说的好像不对,你的赋值语句没有问题,student的引用可以赋值给student的对象,
d=(StudentNode*)malloc(sizeof(StudentNode*));应该改成d=(StudentNode*)malloc(sizeof(StudentNode));你程序运行不了,可能是你的双向链表建立的逻辑存在问题造成的,我这没VC6.0
不能帮你了[/quote]
哦。现在学C#学的有些忘记C++了。
[size=5]1楼是错的[/size]
但是二楼的是对的。
17 楼
tr0217 [专家分:730] 发布于 2010-04-23 13:23:00
我操,写了一大通。居然给刷没了。
楼主按4楼的把两个地方都改了,就不会出现运行错误了。
楼主的算法有一个有问题,会让程序卡死。
这个问题的机制一言两语说不明白。
先给个提示,内存泄露和飘浮引用。
目前的解决方法是把string改为char数组。(不要把c中嵌入c++,而让c++作为c的辅助。程序的主体是c,就不要用c++。更不让c++的类做为结构的成员)
并且提供显示的释放链表的函数。不能让链表中有不使用的节点。
等到你把c++学好了,编译原理有些了解了这个问题你就会明白了。
我来回复