linux c 指针和内存分配内存,linux-C基础系列-内存管理(野指针).md
野指针概述
野指针通常指的是指针变量中保存的值不会死一个合法的内存地址,但又对其访问。需要注意的是野指针不是空指针,而是指向内存不可用的指针。
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相关推荐
- 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- C++中运行一个程序的内存分配情况及qt中的内存管理机制
一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一 ...
- c语言释放内存函数,【C语言】内存分配函数malloc/ calloc/ realloc及内存释放free
前言: 内存区域划分与分配: 1.栈区(stack)--程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放. 2.堆区(heap) -- 在内存开辟另一块存储区域 ...
- 计算机二级换c语言,09年计算机二级C语言辅导:C技巧(内存分配:更换策略,不要为难内存)...
09年计算机二级C语言辅导:C技巧(内存分配:更换策略,不要为难内存) 分类:计算机等级| 更新时间:2008-11-21| 来源:教育联展网 在32位机上(64位也是一样的,但是空间大很多),一个进 ...
- C/C++内存分配与Linux内存管理进程所涉及到的五个数据段 .
一. 在c中分为这几个存储区 1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的, ...
- brk函数 linux,brk和sbrk及内存分配函数相关-linux+内存
brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空 ...
- linux内存分配机制,Linux内存分配机制:SLAB / SLUB / SLOB
Linux内存分配机制:SLAB / SLUB / SLOB [日期:2011-07-15] 来源:Linux社区 作者:do2jiang [字体:大 中 小] slob: introduce the ...
- linux内存分配缺陷,Linux系统优化-内存错误分析
造成内存错误的样例分析 例一:(释放代码段空间导致内存错误) 图1 Coding 运行错误显示: 图2内存错误显示 分析:如图2所示运行后出现内存错误,free(): invalid pointer ...
- 操作系统内存分配算法_操作系统基础45-伙伴系统和slab内存分配
当在用户模式下运行进程请求额外内存时,从内核维护的空闲页帧列表上分配页面.这个列表通常使用页面置换算法来填充,如前所述,它很可能包含散布在物理内存中的空闲页面.也要记住,如果用户进程请求单个字节内存, ...
最新文章
- linux环境变量管理器,运维 - linux(ubuntu) 环境变量管理 (持续更新)
- POJ-2828-Buy Tickets
- 【CSS3】CSS中的定位
- Spring-AOP概述
- 查询过去一个月有付款mysql_MySQL_mysql 月份查询该月有付款的数据,ktime 开始时间串 dtime 到期时间 - phpStudy...
- grep与sed批量处理多个文件中的字符串的方法
- 如何采用python语言绘制一条_如何使用matplotlib绘制一条线?
- python 字符串格式符
- [css] 用css创建一个三角形,并简述原理
- Qt中设置窗体固定大小的方法
- spark 上下游shuffle结果的存放获取
- 升级更新:Oracle关于DB Link在2019年升级的10g版本兼容性
- 【java】ssh the connection is not authenticated
- java生日验证_Java验证身份证号码是否有效
- c++ string
- python秩和比综合评价代码记录
- APP 兼容性测试是什么?8年测试老鸟告诉你
- 计算机控制面板无文件夹,电脑控制面板无恢复选项怎么办
- matlab 菱形符号,matlab 图形符号
- 从实际游戏制作谈如何提高游戏中的打击感
热门文章
- rails table html,Ruby on Rails:如何将字符串呈现为HTML?
- vue.js常用命令
- 3、Finished with error: FormatException: Bad UTF-8 encoding 0xc3 (at offset 169)
- java web应用程序_如何构建Java Web 应用程序 - Spring Boot?
- rails4 ajax 例子,Ajax和Rails 4:创建实例变量并更新视图而不刷新
- JAVA8后接口的新特性
- 第13章 程序的动态加载和执行(二,用户代码)
- pmtk3怎样离线安装
- background 旋转_基于HTML5 Canvas实现工控2D叶轮旋转
- mysql :完整性约束