您的位置:首页 > 其它

野指针形成原理、造成的危害及避免方法

2016-12-01 22:02 225 查看
void * (万能指针)

可以保存任何类型的指针值,但是不可以对这个指针取值;
一定要是相同类型的指针之间才能赋值,因为不同类型步长不同.
不要轻易把float型的指针赋给其它指针,容易出现错误。

野指针 : 随机指向一块内存的指针成为野指针。(因为在计算机中,内存的分配由操作系统来管理,要使用内存需要先向操作系统申请,系统分配后才可以使用,而野指针的内存空间是随机分配的,属于非法访问内存。)

野指针造成的错误叫做内存泄漏,但存在野指针并不一定每次运行程序都会出现段错误,因为可能某次给野指针随机分配的内存地址是其它变量已经申请过的内存地址,这种情况不会出现段错误。
怎样避免野指针 :要养成良好的编码习惯 。

1、定义指针时如果没有初始化,就让它指向NULL,置为空的指针,不能给这个指针所指向的空间做操作。(因为NULL是一个零地址,系统规定不可以对零地址进行操作。其实置为空是无法彻底避免野指针的,置为空只是提醒编程者该指针是野指针,不可以对其进行赋值或其他操作。)

2、当要向一个指针指向的空间赋值时,一定要检查有没有给这个指针分配空间。方法如下:

int* p = malloc(size of (int))

if(p == NULL)

{

printf("malloc error!\n");

exit(1);//跳出整个程序

}

/*这里要说明一下为什么赋值的不是int数据类型的字节长度4。因为在不同平台上,整型的字节长度可能不一样,如果分配的是4,那么当程序在其他平台执行时,整形数据长度可能就不是四个字节,会带来不必要的麻烦。以这种方式写可以保证无论在什么平台分配的都是整型数据的字节长度,从而提高了代码的移植性。*/

3、当给一个指针分配空间时,要检查下有没有分配空间。

4、将分配的内存空间初始化。因为如果不进行初始化可能会有之前的垃圾数据残留,影响程序。可以用memset(p,0,sizeof(int));memset会将p指向的前sizeof(int)空间都置为0。

5、用完后把内存还给系统(释放)

6、释放完后再将指针指向NULL,否则p会再次成为野指针。
#define NULL (void *)0 //NULL指向零地址,不允许对0地址对应的空间做操作。

malloc()函数,形参为要分配的字节大小,返回为这段空间的首地址。

eg : malloc(4)和malloc(sizeof(int)) 后者提高了移植性。

memset(p,0,sizeof(int)) 把p指向的空间全部初始化为0

free(p)释放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息