野指针的学习

1、野指针

    野指针是指向了“垃圾”内存的指着。

2、产生原因

    (1)指针变量没有被初始化。任何指针变量刚刚被创建的时候,是不会自动变成NULL指针的,他的缺省值是随机的,这个时候指针是乱指的。所以指针变量在被创建的同时应该被初始化,让指针指向合法的内存。

    (2)指针P被free或者delect之后,没有设置为NULL;当指着被free之后,其实就是释放了指针指向这块内存进行释放,也就是说指针依旧是指向这个地址,但是这个地址上面的东西不要了,并且系统也不会将这块内存继续保留。后面有可能将这个地址分配给别人,所以free掉之后,有的时候指针还是可以继续操作,但是很有可能系统恰叫将这块内存分配给别人。就会出现程序的崩溃。

    (3)指针的操作超越了变量的作用范。

错误示范:


char *p = (char *)malloc(100);
strcpy(p, "hello");
printf("p = %s\n", p);
free(p);
strcpy(p, "world");
printf("p = %s\n", p);

    指针 p 被free之后,其实就是将p指向的这块内容进行释放,系统也对这块内存不在保留,以后别人malloc 的时候,就会将这个内存分配给别人。所以free 掉之后,就不要再继续使用指着p,会导致程序的崩溃。

解决办法:


char *p = (char *)malloc(100);
strcpy(p, "hello");
printf("p = %s\n", p);
free(p);
p = NULL;
p = (char *)malloc(100);
strcpy(p, "world");
printf("p = %s\n", p);

    指针p 被释放之后,赋值为NULL;后面的可以通过判断 p != NULL 进行判断。被使用之后的指针,绝对不要在继续使用了,重新使用的话,要重新申请新的内存地址,或者指向新的合法的地址。

时间: 2024-10-11 23:18:23

野指针的学习的相关文章

传智播客视频学习 ---->>>> 野指针产生原因和避免方法

野指针产生的原因: 1,指针变量和他所指向的内存空间变量是两个不同的概念 2,虽然调用free(p)方法释放了指针所指向的内存空间,但是指针变量并没有重置成NULL 3,造成释放了所指向的内存空间之后,使用 if( p != NULL ) 还会被执行,还会执行其中的 free() 方法 避免方法: 1,定义指针的时候,初始化其值为 NULL ( char *p = NULL; ) 2,释放指针所指向的内存空间之后,把指针重置成 NULL 1 ······ 2 3 char *p = NULL;

学习笔记之09-空指针和野指针

一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 2.野指针 "野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针.野指针是非常危险的. 二.野指针和空指针例子 接下来用一个简单的例子对比一下野指针和空指针的区别

空指针和野指针

[转自]http://www.cnblogs.com/mjios/archive/2013/04/22/3034788.html 本文目录 一.什么是空指针和野指针 二.野指针和空指针例子 说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C.如果你还没有编程经验,或者对Objective-C.iOS开发不感兴趣,请忽略.学习本专题之前,建议先学习C语言专题. 一.什么是空指针和野指针 1.空指针 1> 没有存储

C程序中可怕的野指针

一.疑问点指针是C语言一个很强大的功能,同时也是很容易让人犯错的一个功能,用错了指针,轻者只是报个错,重者可能整个系统都崩溃了.下面是大家在编写C程序时,经常遇到的一种错误的使用方法,也许在你的学习和工作中就是这样用的,很危险.实例程序如图1所示: 图1 实例程序这段程序比较简单,str1指向的内存区域存放了一个字符串"123",把"123"赋值到str2指向的内存区域,编译时会给出一个告警:local variable 'str2' used without ha

21 野指针

分析下列程序,输出结果:不确定,未定义行为. #include<iostream> #include<stdlib.h> #include<string.h> using namespace std; void test(void) { char *str=(char *)malloc(100); strcpy(str,"hello"); free(str); if(str!=NULL) { strcpy(str,"world")

C语言指针2(空指针,野指针)

//最近,有朋友开玩笑问 int *p  *是指针还是p是指针还是*p是指针,当然了,知道的都知道p是指针 //野指针----->>>指没有指向一个地址的指针(指针指向地址请参考上一篇文章) //空指针---->>指向空(null)的指针就是空指针 //指针的其他用法,指针可以指向指针,指针可以进行+ - * /运算 /* 特别注意,各个编译器都不相同,这里有一种错误写法,如: int *p,int a=10,b=20; p=&b; *p = &a;    

野指针

参考:http://chenqx.github.io/2014/09/25/Cpp-Memory-Management/ 内存管理详解 野指针: 一.申请了指针没有初始化,全局指针未初始化编译时无错误,运行会出错,局部指针编译时会报错--unintialized: 二.malloc申请的内存用free(ptr)释放后,ptr指向的是垃圾内存,或者new出来的对象delete之后,指针所指的对象释放掉了,指针还存在,但指向的是垃圾内存,对待这种错误,可以在释放掉后把指针置为NULL: 三.函数返回

野指针 空指针 通用指针

空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值.指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西.空指针用0表示,C语言保证这个值不会是任何对象的地址.给指针值赋零则使它不再指向任何有意义的东西.为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL.    程序里可以写 p = 0;     或者 p = NULL; 两种写法都把p置为空指针值.相对而言,前一种写法更容易使读程序的人意识到这里是一个指针赋值.操作NULL也会导致不可预知的错误 我

关于空指针NULL、野指针、通用指针

http://www.cnblogs.com/losesea/archive/2012/11/16/2772590.html 首先说一下什么是指针,只要明白了指针的含义,你就明白null的含义了.假设 有语句 int a=10;那么编译器就在内存中开辟1个整型单元存放变量a,我们假设这个整型单元在内存中的地址是 0x1000:那么内存0x1000单元中存放了数据10,每次我们访问a的时候,实际上都是访问的0x1000单元中的10.现在定义:int *p:                 p=&a