这是一个关于数据结构的链表问题


#include<iostream>
#include<conio.h>
#include<string.h>
#define OK 1
#define MAXSIZE 100
using namespace std;
typedef  int Status;
#define OK 1
typedef  struct  
{
char name[5];
float price;    
}Book;

typedef  struct  LNode 
{
Book Elem;
LNode *next;

}LNode,*List;

Status InitList(List L)
{
  L=new LNode();
  if(!L)
      exit(-1);
  else
    (*L).next=NULL;
  return OK;
}

int main()
{
LNode L;

List LL;
InitList(LL);
cout<<(*LL).next;
getch();


return 0;
}

请问初始化后,为何溢出呢?

Status InitList(List L)
改成
Status InitList(List &L)

什么溢出?你说cout<<(*LL).next;?,你只初始化了LL,没有初始化(*LL).next

InitList函数你是按值传递,函数运行完了之后main中的指针LL依然是没有初始化的。

//按值传递, L不改变
Status InitList(List L);

//按引用传递,L值改变
Status InitList(List& L);

//按指针传递,L地址指向的值可以改变
Status InitList(List* L);

另外,按值传递不改变的L的原因是在进入函数Status InitList(List L)时,编译器做了一个赋值操作
List L = LL;
这个L在函数内起作用,LL不起作用

如果传入的是LL的地址,使用按指针传递的方式。那么在Initlist函数内改变L的值不会影响LL的值,但由于LL和L是指针,他们的值指向相同的地址,修改L->next或者L->Elem会影响LL->next或者LL->Elem的值。