回 帖 发 新 帖 刷新版面

主题:问一个数组传参的问题

不是很理解啊,试着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]);      //一个一个插入学生数据

回复列表 (共17个回复)

11 楼

想问问你的代码怎么能够运行的
    init(student[i]);  初始化学生的时候传参类型根本不对啊

12 楼

饿、。真是不好意思。。我改了后来= =还是不行~结果原文件没存。。上传的附件没改。。不过改了也不行= =~囧我才发现~~
内存错误变成了
    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 楼

贴一下你改过的student初始化吧,目前没法测试你的代码

14 楼

恩恩,送到附件里了,错误信息

15 楼


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 楼

[quote]1楼说的好像不对,你的赋值语句没有问题,student的引用可以赋值给student的对象,
d=(StudentNode*)malloc(sizeof(StudentNode*));应该改成d=(StudentNode*)malloc(sizeof(StudentNode));你程序运行不了,可能是你的双向链表建立的逻辑存在问题造成的,我这没VC6.0
不能帮你了[/quote]
哦。现在学C#学的有些忘记C++了。
[size=5]1楼是错的[/size]
但是二楼的是对的。

17 楼

我操,写了一大通。居然给刷没了。
楼主按4楼的把两个地方都改了,就不会出现运行错误了。
楼主的算法有一个有问题,会让程序卡死。
这个问题的机制一言两语说不明白。
先给个提示,内存泄露和飘浮引用。
目前的解决方法是把string改为char数组。(不要把c中嵌入c++,而让c++作为c的辅助。程序的主体是c,就不要用c++。更不让c++的类做为结构的成员)
并且提供显示的释放链表的函数。不能让链表中有不使用的节点。

等到你把c++学好了,编译原理有些了解了这个问题你就会明白了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册