关于结构体变量指针



程序中使用结构体类型指针引用结构体变量的成员,需要通过C提供的函数malloc()来为指针分配安全的地址。


最近在结构体上做了个实验:

声明一个结构体类型,如下:

typedef struct
{
    int score;
    char *str;
}test;

然后定义一个结构体变量,一个结构体指针变量,如下:

test a,*b;

对于结构体变量a,则可以直接引用结构体并进行赋值。如下:

a.score = 100;

a.str = "Liming";

printf("%s:%d\n", a.str,a.score);

到此为止,此代码程序编译通过,且正常运行。


而对于结构体指针变量b,发现若像结构体变量a那样直接引用并赋值,编译也能通过,但运行时会报以下错误:

“Segmentation fault (core dumped)”此类错误,一般是对内存操作不当引起的,可能情况为:

(1)数组超出范围; (2)没有为指针所指向的数据分配内存空间(指针无被赋初值);


因为你定义了一个结构体指针变量b(只是告知系统b是一个结构体类型的指针,此时该指针的内容为未知),

用来指向此类结构体,但是你却没有给他赋值,此时p的值是未知的(即野指针),你并没有在内存中为b分配

任何空间,所以b->str="Liming"这句就会出错误.


对于结构指针,必须为其分配空间,同时如果其内部成员是指针的话,有两种方法:

1.将指针指向一块已经分配好空间的内存块(像你指向字符串常量);2.为其分配空间(再malloc一下)

不然就都是野指针。或者可以这样定义

typedef struct{  
       int score;
       char str[len];
}test;
 
定义时就把空间分配好,这样就不会出现段(内存)错误了.


扩展:

int *p;

若定义了一个指针而又不初始化(没让它指向一个常量区,也不给它分配空间,也就是野指针),那么此时对该

指针的任何操作都会造成程序崩溃的,例如使用strcpy函数给该指针赋值。因为该指针只是被定义了指向所定义

类型(此处为int类型),而具体让它指向哪里却未说明,这样如果一上来就让它做什么事,就会导致程序崩溃。


总结:

一个指针变量刚被定义时,所指向的内容是未知的,可能指向NULL,可能指向某个“不可写”的内存块,未赋值的

指针存在太多不确定性,存在非常大的安全隐患。如若在一个大型程序中出现“野指针”,则程序运行出现问题时,

该bug是很难找出来的。



类比:指针是一个酒店经理,告诉他让他去管理一个酒店,却不告诉他让他去哪里管理,管理什么酒店,而此时,

却突然给他一个任务:你所管理的酒店不能给日本人住,只能给中国人住。OK,该经理接到该任务时就怒了:

你大爷的,你都没告诉我让我去管理哪个酒店(即使是一个小宾馆也没有),现在让我执行这个任务,你让我拿什

么执行,我不干了。
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值