Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2422590
  • 博文数量: 298
  • 博客积分: 7876
  • 博客等级: 准将
  • 技术积分: 5500
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-23 13:39
文章存档

2013年(2)

2012年(142)

2011年(154)

分类: 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,表明还没有分配,通过检查指针的值来确定。

阅读(4334) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~