全部博文(298)
分类: C/C++
2011-05-26 00:51:36
链表的常见错误:结构体指针的误用
我们在编写链表的时候,经常使用到结构体指针,但是很多人经常不是很正确的使用结构体指针,我们这里写如下代码:
#include
#include
#include
struct node
{
int x;
double y;
struct node *next;
};
struct node h;
struct node *p = &h;
struct node *p1;
void test_pointer()
{
p->x = 100;
p->y = 10;
printf("p->x:%d,p->y:%lf\n",p->x,p->y);
printf("p1:%0x\n",p1);
p1->x = 100;
p1->y = 10;
printf("p{%d, %lf},p1{%d, %lf}\n",p->x,p->y,p1->x,p1->y);
}
int main(int argc, char **argv)
{
test_pointer();
return 0;
}
程序运行结果:
p->x:100,p->y:10.000000
p1:0
我们这里注意到只有指针struct node *p能够正常使用,使用struct node *p1的时候会出现错呢,这是为什么呢?我们定义struct node *p的时候为他赋初值了struct node *p = &h;
,而p1没有进行赋初值的操作,由于他是全局变量,系统会自动赋初值为0,两者相当于都是有初始值的,单位唯一不同的是,p的初始值是我们已经定义了struct node h;的地址,p1的初始值是一个我们没有使用的地址,使用p就是相当于我们已经为它分配了空间了,而p1没有,所以不能为p1指针的指向的地址里面的内容赋值,如果我们为他动态分配空间了又会怎么样了呢???
#include
#include
#include
struct node
{
int x;
double y;
struct node *next;
};
struct node h;
struct node *p = &h;
struct node *p1;
void test_pointer()
{
p->x = 100;
p->y = 10;
printf("p->x:%d,p->y:%lf\n",p->x,p->y);
printf("p1:%0x\n",p1);
p1 = (struct node *)malloc(sizeof(struct node));
printf("p1:%0x\n",p1);
p1->x = 100;
p1->y = 10;
printf("p{%d, %lf},p1{%d, %lf}\n",p->x,p->y,p1->x,p1->y);
}
int main(int argc, char **argv)
{
test_pointer();
return 0;
}
程序结果:
p->x:100,p->y:10.000000
p1:0
p1:3807b8
p{100, 10.000000},p1{100, 10.000000}
能够正确的运行。先前没有正确运行就是因为使用了没有分配空间的指针,不管是静态分配的还是动态分配的,都要分配了才能使用,struct node *p的使用就相当于静态分配。
注意:为了避免使用未分配的指针,也就是野指针,我们应该定义指针的时候为其赋初始值NULL,表明还没有分配,通过检查指针的值来确定。