回 帖 发 新 帖 刷新版面

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

不是很理解啊,试着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个回复)

沙发

void insert (StudentList &L,Student &S)
按引用穿值,是为了修改一个值。你这按引用传值是为了干什么,将一个外部的有可能被析构的对象或者有可能被销毁的东西的引用赋值给一个非引用吗。

S是一个Student 的引用,里边的那个data 是个Student,当然不能那样搞啊。

板凳

C++里的指针其实就好像是java c#中的引用,但C#和java 中的引用是限制级别高的指针,即即将指针上的内存算法给去掉了,为了安全的目的;只能通过它访问对象,而不能进行p++(p是指向某个类型的指针)之内的运算使其指向内存的另一个位置。
c++里的引用是限制级别更高的指针,即不能通过引用来初始化一个对象占用的存储空间,只能指向已经创建却不是用new创建的对象。

3 楼

带&与不带&当时都是纯粹实验性的。。结果都不行。。汗水。。应该怎么弄呢?如果我想这么赋值

4 楼

1楼说的好像不对,你的赋值语句没有问题,student的引用可以赋值给student的对象,
d=(StudentNode*)malloc(sizeof(StudentNode*));应该改成d=(StudentNode*)malloc(sizeof(StudentNode));你程序运行不了,可能是你的双向链表建立的逻辑存在问题造成的,我这没VC6.0
不能帮你了

5 楼


typedef struct StudentNode      //双向链表中学生节点定义
{
    Student data;
    StudentNode* next;
    StudentNode* former;
}StudentNode;
双向表结构如上,我的表应该没有问题,我看了一些东西上面说这个数组好像是不能直接传值。。。不过是实在不知道怎么传。。。我试过把结构体分解传值,不行,建立中间变量传值,还是不行。、、、

6 楼

你传的是个链表头结点的引用,修改是可以的,改正内存分配后出了什么新问题嘛?

7 楼


是赋值的问题,给d直接赋值是可以进行的,但是一旦要给d赋值传入的结构数组参数就会出现一个异常。。。。断点一步一步看的。。。然后试过结构体拆散单独赋值貌似失败了,建立中间变量赋值依旧失败了。。。就是无法访问,但是不赋值直接用output方法输出结构体数组中那个元素却没有问题。。。

8 楼

用memset取代直接赋值试试,另外数据域结构体逐成员转移应该不会有问题吧
你用的编译器是?

9 楼


vc6.0,sp6英文。。。。我再试试。。

10 楼


逐成员转移时把结构体用结构体里的成员赋值么,开始觉得麻烦没这么做,然后试过了不行,刚才又试了试
    d->data.Name=S.Name; 
    结果依旧不行,再次给我抛出了C++定义文件。。
        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); }}

我来回复

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