野指针概述

野指针通常指的是指针变量中保存的值不会死一个合法的内存地址,但又对其访问。需要注意的是野指针不是空指针,而是指向内存不可用的指针。

C语言中对于空指针(NULL)是可以判断出来的,但是野指针是无法判断一个非空指针是否为野指针。

野指针一般的来源如下:

局部指针变量没有初始化

#include

int main()

{

char *p;

strcpy(p,"haha"); // 野指针

return 0;

}

使用已释放的指针

int main()

{

int *p = (int *)malloc(sizeof(int)*5);

free(p);

*p = 1; // 野指针

return 0;

}

指针所指向的内存空间在使用前被销毁

#include

char *fun()

{

char p[] = "haha";

return p;

}

int main()

{

char *p = fun();

printf("%s\n",p); // 野指针

return 0;

}

指针经典错误

①被指向的变量没有初始化

②没有为指针指向的内存分配足够的内存

struct Demo

{

int *p;

}

int main()

{

struct Demo d1,d2;

int i;

for(i = 0; i < 10; i++){

d1.p[i] = i; // 未初始化

}

d2.p = (int *)calloc(5,sizeof(int));

for(i = 0; i < 10; i++){

d2.p[i] = i; // 越界,没有分配足够的空间

}

free(d2.p);

return 0;

}

内存分配成功但没有初始化

#include

#include

int main()

{

char *s = (char *)malloc(10);

printf("%s\n",s); // 字符串以 '\0' 为结束符,如不初始化,则未知 '\0'在哪。

free(s);

return 0;

}

数组越界

#include

void fun(int a[10])

{

int i;

for(i = 0; i < 10 ;i++){

a[i] = i; // 越界

printf("%d\n",a[i]);

}

}

int main()

{

int a[5];

fun(a);

return 0;

}

内存泄漏

void fun(unsigned int size)

{

int *p = malloc(sizeof(int) * size);

int i;

if(size % 2 != 0){

return ; // 未释放已申请的内存

}

for(i = 0; i < size ;i++){

p[i] = i;

printf("%d\n",p[i]);

}

free(p);

}

此处可表明,函数设计时最好是单入口单出口。

多次对指针进行内存释放

void fun(int *p,int size)

{

int i;

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));

fun(p,5);

free(p); // 多次释放

return 0;

}

此处可以表明在进行内存操作时,其原则是“谁申请,谁释放”,并且在释放后对指针置空。

使用已释放的指针

void fun(int *p,int size)

{

int i;

for(i = 0; i < size ;i++){

printf("%d\n",p[i]);

}

free(p);

}

int main()

{

int *p = malloc(5 * sizeof(int));

int i = 0;

fun(p,5);

for(i = 0;i < 5 ; i++){

p[i] = i; // 内存空间已释放

}

return 0;

}

内存使用一般规则

① 使用malloc等申请内存后,必须立即检查返回值是否为NULL;

② 牢记数组长度,防止越界操作,可考虑使用柔性数组;

③ 内存申请和释放操作必须匹配,防止内存泄漏也可防止多次释放;

④ 如必须在某个函数中释放一个内存,则建议添加一个参数选项,来显式提醒调用者是否释放内存;

⑤ free后立即将其赋值为NULL,因为free的参数为空时是合法参数;

email: MingruiZhou@outlook.com

linux c 指针和内存分配内存,linux-C基础系列-内存管理(野指针).md相关推荐

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

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

  2. C++中运行一个程序的内存分配情况及qt中的内存管理机制

    一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一 ...

  3. c语言释放内存函数,【C语言】内存分配函数malloc/ calloc/ realloc及内存释放free

    前言: 内存区域划分与分配: 1.栈区(stack)--程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放. 2.堆区(heap) -- 在内存开辟另一块存储区域 ...

  4. 计算机二级换c语言,09年计算机二级C语言辅导:C技巧(内存分配:更换策略,不要为难内存)...

    09年计算机二级C语言辅导:C技巧(内存分配:更换策略,不要为难内存) 分类:计算机等级| 更新时间:2008-11-21| 来源:教育联展网 在32位机上(64位也是一样的,但是空间大很多),一个进 ...

  5. C/C++内存分配与Linux内存管理进程所涉及到的五个数据段 .

    一. 在c中分为这几个存储区 1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的, ...

  6. brk函数 linux,brk和sbrk及内存分配函数相关-linux+内存

    brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空 ...

  7. linux内存分配机制,Linux内存分配机制:SLAB / SLUB / SLOB

    Linux内存分配机制:SLAB / SLUB / SLOB [日期:2011-07-15] 来源:Linux社区 作者:do2jiang [字体:大 中 小] slob: introduce the ...

  8. linux内存分配缺陷,Linux系统优化-内存错误分析

    造成内存错误的样例分析 例一:(释放代码段空间导致内存错误) 图1  Coding 运行错误显示: 图2内存错误显示 分析:如图2所示运行后出现内存错误,free(): invalid pointer ...

  9. 操作系统内存分配算法_操作系统基础45-伙伴系统和slab内存分配

    当在用户模式下运行进程请求额外内存时,从内核维护的空闲页帧列表上分配页面.这个列表通常使用页面置换算法来填充,如前所述,它很可能包含散布在物理内存中的空闲页面.也要记住,如果用户进程请求单个字节内存, ...

最新文章

  1. linux环境变量管理器,运维 - linux(ubuntu) 环境变量管理 (持续更新)
  2. POJ-2828-Buy Tickets
  3. 【CSS3】CSS中的定位
  4. Spring-AOP概述
  5. 查询过去一个月有付款mysql_MySQL_mysql 月份查询该月有付款的数据,ktime 开始时间串 dtime 到期时间 - phpStudy...
  6. grep与sed批量处理多个文件中的字符串的方法
  7. 如何采用python语言绘制一条_如何使用matplotlib绘制一条线?
  8. python 字符串格式符
  9. [css] 用css创建一个三角形,并简述原理
  10. Qt中设置窗体固定大小的方法
  11. spark 上下游shuffle结果的存放获取
  12. 升级更新:Oracle关于DB Link在2019年升级的10g版本兼容性
  13. 【java】ssh the connection is not authenticated
  14. java生日验证_Java验证身份证号码是否有效
  15. c++ string
  16. python秩和比综合评价代码记录
  17. APP 兼容性测试是什么?8年测试老鸟告诉你
  18. 计算机控制面板无文件夹,电脑控制面板无恢复选项怎么办
  19. matlab 菱形符号,matlab 图形符号
  20. 从实际游戏制作谈如何提高游戏中的打击感

热门文章

  1. rails table html,Ruby on Rails:如何将字符串呈现为HTML?
  2. vue.js常用命令
  3. 3、Finished with error: FormatException: Bad UTF-8 encoding 0xc3 (at offset 169)
  4. java web应用程序_如何构建Java Web 应用程序 - Spring Boot?
  5. rails4 ajax 例子,Ajax和Rails 4:创建实例变量并更新视图而不刷新
  6. JAVA8后接口的新特性
  7. 第13章 程序的动态加载和执行(二,用户代码)
  8. pmtk3怎样离线安装
  9. background 旋转_基于HTML5 Canvas实现工控2D叶轮旋转
  10. mysql :完整性约束