【linux c】什么是野指针以及如何避免野指针_学习笔记_010

来源:互联网 发布:mac里面xp升级win7 编辑:程序博客网 时间:2024/05/22 22:21

1.首先以一个示例来认识野指针:

#include <stdio.h> int main(){    int * p;    scanf("%d", p);    printf("%d\n", * p);       return 0;}


该段程序编译并未报任何错误,而运行之后,输入具体值后,报段错误:


2

段错误

 

为什么会出现段错误?

因为此处定义了一个局部变量,系统随机分配给p一个地址,往p保存的随机地址中赋值,该值不一定可用。

 

说了这么多,那么什么是野指针

野指针:随机指向一块内存指针。这样的指针会导致内存泄漏(没有让p使用却使用了)。

不可用内存区域主要分为两块:

①指向没有访问权限的内存;

②指向已经释放的内存。

 

但是为什么有时候用了野指针,却可以正常运行呢?

这就好比你在路上捡了一把钥匙,虽然可以开对应的房间门,但是却不能随意去开人家的门,这是犯法。但是,当你捡到的钥匙是自己家的,或者是女朋友家的,你就可以合法地开门了。

运行正常,就是因为野指针捡到了自己家的”钥匙”。

 

2.如何避免野指针

以一个示例来讲解如何避免野指针:

#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAX_SIZE sizeof(char) * 100int main(){    char *ptr = NULL;       //若定义的指针没有指向,则赋值为空    ptr = (char *)malloc(MAX_SIZE);     //为指针分配动态内存空间    if(NULL == ptr)     //判断动态内存是否分配成功    {        printf("error malloc\n");    exit(1);    }    memset(ptr, 0, MAX_SIZE);       //对分配的内存进行初始化,初始化为0    scanf("%s", ptr);           printf("ptr = %s\n",ptr);    free(ptr);      //指针使用完后释放内存    ptr = NULL;     //释放后将指针置为空    return 0;}

野指针无法完全杜绝,但是通过如上的编码规范,可以很大程度上避免野指针。

 

0 0
原创粉丝点击