初始野指针

C语言中没有任何手段可以判断一个指针是否为野指针!

野指针的由来

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

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>struct Student
{char* name;int number;
};int main()
{struct Student s;//char a[] = {0};//s.name = a;strcpy(s.name, "Delphi Tang"); // OOPS!s.number = 99;return 0;
}

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

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <malloc.h>
#include <string.h>void func(char* p)
{printf("%s\n", p);free(p);
}int main()
{char* s = (char*)malloc(5);strcpy(s, "Delphi Tang");func(s);printf("%s\n", s); // OOPS!return 0;
}

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

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>char* func()
{char p[] = "Delphi Tang";//printf("%s\n", p);return p;
}int main()
{//printf("%s\n", func());char* s = func();printf("%s\n", s); // OOPS!return 0;
}

非法内存操作分析

1.结构体成员指针未进行初始化                 没有为结构体指针分配足够的内存

#include <stdio.h>
#include <malloc.h>struct Demo
{int* p;
};int main()
{struct Demo d1;struct Demo d2;int i = 0;for (i = 0; i<10; i++){d1.p[i] = 0; // OOPS!  d1.p未进行初始化}d2.p = (int*)calloc(5, sizeof(int));for (i = 0; i<10; i++){d2.p[i] = i; // OOPS! 没有为指针分配足够的内存}free(d2.p);return 0;
}

2.内存分配成功,但并未初始化

#include <stdio.h>
#include <malloc.h>int main()
{char* s = (char*)malloc(10);printf(s); // OOPS!free(s);return 0;
}

3.数组越界

#include <stdio.h>void f(int a[10])
{int i = 0;for(i=0; i<10; i++){a[i] = i; // OOPS! 数组越界printf("%d\n", a[i]);}
}int main()
{int a[5];f(a);return 0;
}

4.内存泄露分析

5.多次指针释放

#include <stdio.h>
#include <malloc.h>void f(int* p, int size)
{int i = 0;for(i=0; i<size; i++){p[i] = i;printf("%d\n", p[i]);}free(p);
}int main()
{int* p = (int*)malloc(5 * sizeof(int));f(p, 5);free(p); // OOPS!return 0;
}

6.使用已释放的指针

#include <stdio.h>
#include <malloc.h>void f(int* p, int size)
{int i = 0;for(i=0; i<size; i++){printf("%d\n", p[i]);}free(p);
}int main()
{int* p = (int*)malloc(5 * sizeof(int));int i = 0;f(p, 5);for(i=0; i<5; i++){p[i] = i; // OOPS!}return 0;
}

C语言中的交通规则

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

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


#include <stdio.h>
#include <malloc.h>typedef struct _soft_array {int len;int array[];
}SoftArray;int main()
{int i = 0;SoftArray *sa = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(int) * 10);sa->len = 10;for (i = 0; i < sa->len; i++) {sa->array[i] = i + 1;}for (i = 0; i < sa->len; i++) {printf("%d ", sa->array[i]);}return 0;
}

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

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

c32-野指针和内存操作分析相关推荐

  1. 什么是野指针和内存泄露?如何避免野指针

    内存泄露: (1). 访问已经释放的内存; (2) 访问没有权限的内存 野指针: 指向内存被释放的内存或者没有访问权限的内存的指针. "野指针"的成因主要有3种: (1) 指针变量 ...

  2. 野指针与内存泄漏那些事

    野指针:不是NULL指针,是指向垃圾内存的指针 野指针成因: 1.指针变量没有被初始化:指针变量在创建时同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存. 2.指针p被free或者d ...

  3. C语言中野指针与内存泄漏

    内存泄漏 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,不能被任何程序再次使用,直到程序结束.即所谓内存泄漏. 注意:内存泄漏是指堆内存的泄漏. 简单的说就是申请了 ...

  4. 【C 语言必知必会】内存管理、动态分配内存、野指针

    C 语言内存管理.动态分配内存.野指针 文章目录 C 语言内存管理.动态分配内存.野指针 前言: 1.内存分区 1.1 代码区 1.2.1 全局初始化数据区(静态数据区data段) 1.2.2 未初始 ...

  5. (整理)C/C++野指针

    一.莫名的恐惧感 对于指针确实有种莫名的恐惧感,从刚开始学习的时候就被老师灌输的概念是指针功能很强大,但是用得不够好,会有很大的副作用.什么叫用得够好?初学者谁都 不会用,那且不是都不能用了?如果都这 ...

  6. C++中野指针问题分析总结

    其实项目一直被野指针困扰,一直在讨论,居然没有什么下文,下文正式由我接受这个问题. 场景是这样:指针间互相引用,一个被删除的时候,另外一个不知道,它再使用的时候就会异常,因为此时指针已经为空了. 我今 ...

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

    2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在 ...

  8. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  9. C++阶段01笔记07【指针(基本概念、变量定义和使用、内存空间、空指针和野指针、const修饰指针、指针和数组、指针和函数)】

    C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 7 指针 7.1 指针的基本概念 7.2 指针变量的定义和使用 示例 7.3 指针所占内存空间 示例 7.4 空指针和野指针 示 ...

  10. 【C语言进阶深度学习记录】三十七 C/C++中造成程序内存错误的原因(野指针)

    什么是野指针? 指针变量存的地址是一块非法内存地址.进而形成野指针.但是需要注意一点,野指针不是NULL指针. 文章目录 1 野指针的概念 1.1 野指针代码案例初探 2 如何避免野指针 2.1 野指 ...

最新文章

  1. Docker学习(5)——创建私有仓库,为私有仓库添加web界面
  2. 小米副总裁崔宝秋:智能手机是今天AI技术最大的平台,AIoT又让AI无处不在 | MEET 2021...
  3. vue2.0小示例一个~~新鲜出炉哦。欢迎大家留言
  4. idea导入nodejs插件_sbt 项目导入问题
  5. 十一届蓝桥杯国赛 扩散-多源bfs
  6. 缺陷定位 | 分析推理定位BUG案例(三)
  7. idea中使用github
  8. pwm波控制舵机原理(转)
  9. 什么是UL2809认证?
  10. 西班牙国家德比次回合时间确定 中国球迷需熬夜
  11. 全球高智商俱乐部门萨出品,最强大脑达人推荐,让孩子挑战脑力极限,玩出高智商思维!...
  12. Linux系统引导过程及排除启动故障
  13. 消除span之间的空隙
  14. 关于TLC2543不常见问题
  15. 计算机制作节日贺卡教案,制作节日贺卡之教学设计
  16. Maven系列之使用阿里云仓库
  17. 用Visio做工作流程图
  18. Lua--pairs和ipairs遍历区别
  19. 《搜索》— NYOJ 82 迷宫寻宝(一)
  20. WinRAR4.20注册文件key文件注册码

热门文章

  1. java判断对象无数据_Java 判断实体对象及所有属性是否为空的操作
  2. 领秀加速器软件介绍及功能介绍
  3. 新型开关电源优化设计与实例详解全书.pdf_高频电路设计中,如何应对“不理想”的电容与电感?...
  4. 打飞机小游戏,附带源码
  5. Go基础编程:Socket编程
  6. 完整记录一则Oracle 11.2.0.4单实例打PSU补丁的过程
  7. 《JavaScript高级程序设计 第三版》学习笔记 (十三)高级函数
  8. 最新友情链接交易平台源码,友链源码,友情链接,友链平台仿alivv爱链网源码下载
  9. 无需软件实现QQ空间秒赞以及赞空间全部说说
  10. oracle crystall ball,Oracle Crystal Ball下载