在初学链表时,我写了以下的一段代码来构建一个链表:
#include<iostream>
using namespace std;
int main()
{
int i;
struct node
{
int a;
node *next;
};
node *head ,*rear,*p;
head=rear;
for (i=0;i<10;i++)
{
p=new node;rear->next=p;
p->a=i;rear=p;
};
rear->next=0;
return 0;
}
这段代码能通过编译,但是运行错误,这是因为定义head和rear时只是给他们做了一个声明,并没有给他们分配空间,所以是不能对他们进行任何操作的.所以必须加上hear=rear=new node.或者让他们指向一个node型变量.
任何指针在定义时都要初始化,或者让他指向一个同类型变量,这是一个好习惯.
ps:经过更进一步的学习后,错误的真正原因是:当定义了一个int型的指针变量p时,系统会在栈里面自动为p分配内存空间,注意是为p分配内存空间!!!而此时p指向的内存地址是0(或者是一个其他的地址值,根据不同的编译器而定).此时若对p进行解引用操作,能通过编译,因为p确实有一个指向的地址,但是这个地址是错误的,或者说是无意义的,所以再运行的时候会出错.