程序中使用结构体类型指针引用结构体变量的成员,需要通过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,该经理接到该任务时就怒了:
你大爷的,你都没告诉我让我去管理哪个酒店(即使是一个小宾馆也没有),现在让我执行这个任务,你让我拿什
么执行,我不干了。