C语言-----野指针

问题所在

1、局部指针变量没有被初始化

2、使用已经释放过后的指针

3、指针所指向的变量在指针之前被销毁

4、结构体成员指针未初始化, 没有为结构体指针分配足够的内存 ,内存越界(考虑使用柔性数组)和泄露

避免规则

1、用malloc申请了内存之后,应该立即检查指针值是否为NULL,防止使用值为NULL的指针

2、牢记数组的长度,防止数组越界操作,考虑使用柔性数组

3、动态申请操作必须和释放操作匹配,防止内存泄露和多次释放

4、free指针之后必须立即赋值为NULL

malloc用于从堆中分配一块指定大小的内存,以void *的类型返回这块内存的起始地址。malloc的参数就是要分配的内存的大小,以字节为单位。 
所以如果要分配1个整型空间就需要malloc(sizeof(int)),由于返回的void *不能直接赋值给int *,所以还要进行一次强制类型转换int * s=(int*)malloc(sizeof(int));

struct Student
{
char* name;
int number;
};

int main()
{
struct Student s;

strcpy(s.name, "gggg"); // OOPS!   ////////////////////////////////////野指针,,不能随便赋值,因为s是一个局部变量,name保存的地址是个随机值,不能往随机值里写东西/////////////////////////////////////////////

s.number = 99;

return 0;
}

时间: 2024-11-07 22:02:05

C语言-----野指针的相关文章

C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针

(1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放,造成内存泄露,下面的例子就可能造成20个字节的泄露,内存泄露不是一个立即会引发故障的错误,但是 它将消耗系统内存. void function1() { char *pa; pa = (char*)malloc(sizeof(char)*20); if(NULL !=pa) { strcpy(pa,"hello"); printf("pa = %x\n",

Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争

2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在的问题.其最大的特点在于保持较高的运行效率.深入的底层控制和广泛应用范围的同时,解决了传统C语言和C++语言中的内存安全问题.2009年,Mozilla接手Rust项目,创建了以Graydon为首的专业全职开发团队,并且开放了该项目的源代码.2012年1月,第一个面向公众的预览版本--v0.1 发布

C语言-第32课 - 野指针和内存操作分析

第32课 - 野指针和内存操作分析 一.概念 初识野指针 l 野指针通常是因为指针变量中保存的值不是一个合法的内存地址而造成的. l 野指针不是NULL指针,是指向不可用内存的指针. l NULL指针不容易用错,因为if语句很好判断一个指针是不是NULL. l C语言中没有任何手段可以判断一个指针是否为野指针. 野指针的由来 (1)局部指针变量没有被初始化. 例: #include <stdio.h> #include <string.h> struct Student { cha

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

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

C语言进阶之路(三)----野指针的产生原因及解决办法

1.会产生野指针的做法 #include <stdio.h> //这就是一种错误的写法 int main(){ int *p = NULL; p = (int *)malloc(4); //释放P所指向的内存空间,但指针变量p仍然留在栈中,成为了野指针 if (p != NULL){ free(p); } if (p != NULL){ free(p); } return 0; } 2.正确的做法: #include <stdio.h>//指针变量和指针所指向的内存变量是两个不同的

OC语言—空指针和野指针

一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 2.野指针 "野指针"不是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

野指针错误实例

野指针,也就是指向不可用内存区域的指针.通常对这种指针进行操作的话,将会使程序发生不可预知的错误. 这是野指针的定义,但很多C语言新手对它还是很陌生,下面我就简单举一个例子来看一看.在VC6.0中输入以下代码: #include <malloc.h> #include <stdio.h> void main() { char *p; //...可能有别的很多操作 if(p != NULL) { free(p); } else { p = (char *)malloc(4); } /