//动态内存分配
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h> int main()
{//动态内存开辟 //向内存申请10个整形的空间int* p = (int* )malloc(10*sizeof(int));if(p == NULL){printf("开辟失败\n");//打印错误原因printf("%s\n",strerror(errno)); } else {int i = 0;for(i=0;i<10;i++){*(p+i) = i;}for(i=0;i<10;i++){printf("%d ",*(p+i));}}//当动态申请的空间不再使用时//就应该还给操作系统free(p); p = NULL;return 0;
} 

calloc开辟动态内存空间 会初始化为0

int main()
{int* p = (int*)calloc(10,sizeof(int));if(p == NULL){printf("%s",strerror(errno));}else{int i = 0;for(i=0;i<10;i++){*(p+i) = i;}for(i=0;i<10;i++){printf("%d ",*(p+i));}}free(p);//释放动态开辟的空间的 p = NULL;return 0;
}

realloc  调整动态开辟内存空间大小

int main()
{int* p = (int*)malloc(20);if(p == NULL){printf("%s",strerror(errno));}//只是在使用malloc开辟的20个字节空间//当我们发现开辟的20个字节的空间不够使用时//我们希望可以开辟40个字节的空间//这里就可以使用realloc来调整动态开辟的空间 //使用realloc时应该注意//1.如果p指向的空间之后有足够的内存空间可以追加,则直接追加 并返回p//2.如果p指向的空间之后没有足够的内存空间可以追加,则realloc函数会//重新找一个新的内存空间 来满足需求 并把原来内存中的数据拷贝 释放原来的内存空间//最后返回新开辟的内存空间的地址 //3.要用一个新的变量来接受realloc函数的返回值 else{int* pp = (int*)realloc(p,40); int i = 0;for(i=0;i<5;i++){*(pp+i) = i;}for(i=0;i<10;i++){printf("%d ",*(pp+i));}}free(p);//释放动态开辟的空间的 p = NULL;return 0;
}

常见的动态内存错误

1.对空指针的解引用操作

void test()
{int *p = (int *)malloc(INT_MAX/4);*p = 20;//如果p的值是NULL,就会有问题free(p);
}

所以开辟好动态内存空间之后就要判断指针的有效性

 if(p == NULL){printf("%s",strerror(errno));}

2.对动态开辟空间的越界访问

void test()
{int i = 0;int *p = (int *)malloc(10*sizeof(int));if(NULL == p){exit(EXIT_FAILURE);}for(i=0; i<=10; i++){*(p+i) = i;//当i是10的时候越界访问}free(p);
}

3.对非动态内存开辟的空间使用free进行释放

void test()
{int a = 10;int *p = &a;free(p);//这里就会出现错误
}

4.使用free释放动态内存开辟的一部分

void test()
{int *p = (int *)malloc(100);p++;free(p);//p不再指向动态内存的起始位置
}//*(p+i)这种形式可以有效的避免对p的改变

5.对同一块动态内存进行多次释放

void test()
{int *p = (int *)malloc(100);free(p);free(p);//重复释放
}

free(p);与p = NULL;打包一块 这样下面再有free(p);也不会出现错误

6.动态内存开辟的空间忘记释放(内存泄漏)

void test()
{int *p = (int *)malloc(100);if(NULL != p){*p = 20;}
}int main()
{while(1){test();}
return 0;
}

动态内存的开辟与释放相关推荐

  1. 在堆区开辟内存(动态内存的开辟)

    目录 ​ 零.前言 1.基本概念 1.什么是动态内存 2.开辟动态内存的作用 1.在栈区开辟的空间 2.在堆区开辟空间 2.动态内存开辟的函数 1.void *malloc( size_t size ...

  2. C++动态内存会被自动释放吗?

    C++动态内存会被自动释放吗? 函数体内的局部变量在函数结束时自动消亡.很多人误以为示例7-6是正确的.理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋.这是错觉! void Fun ...

  3. 动态内存的申请和释放

    动态内存的申请和释放 文章目录 动态内存的申请和释放 1. malloc() 和 free() 的基本概念以及基本用法 1.1 函数原型及说明: 1.2 被释放的指针 1.3 注意事项 2. mall ...

  4. 结构体的使用和动态内存的分配及释放

    结构体 什么是结构体?结构体是用户根据实际需要自己定义的复合数据类型.结构体的出现是为了表示一些复杂的数据,而普通的数据类型无法满足要求. 结构体的定义: struct Student //struc ...

  5. 动态内存的分配与释放

    1.new与delete运算 c++提供了两个中重要的运算符:new和delete.由于他们是运算符不是函数,因此执行效率更高. 运算符 功能 目 结合性 用法 new[] 动态分配 单目 自右向左 ...

  6. 比大小,人类智慧天花板,任意类型,任意个数。内容包含函数模板的创建,类的创建,动态内存的分配与释放,函数调用指针的用法。牵扯多个知识点。

    比大小,看这一篇就足够,大家好,我是姜姜一名热爱C++编程的大学生,接下来我将通过代码演示如何利用C++实现任意类型,任意个数的比大小,并且找出最大的数. 由于本人比较懒,所有没写注释还请各位读者多多 ...

  7. C语言之内存模型以及动态内存分配

    目录 内存分区模型 C/C++内存开辟 按照程序运行前后分区 程序运行前 代码区 全局区 程序运行后 栈区 堆区 关于栈 栈与静态区(数据段) 动态内存分配 那么使用动态内存的好处在哪? 常见的内存使 ...

  8. 动态内存管理(开辟以及释放动态内存空间)

    文章目录 前言 malloc函数 calloc函数 realloc函数 free函数 - 避免内存泄漏 常见的动态内存错误 前言 如果我们被问道:如何创建一个可以根据用户需求来开辟大小的数组? 可能有 ...

  9. C语言之动态内存开辟之malloc

    说到动态内存开辟,就不得不谈malloc.calloc.realloc以及free,所以接下来分别谈一下这四个函数. 1.malloc(开辟动态内存空间) 头文件:#include<stdlib ...

最新文章

  1. ArcGIS Server 内存占用相关
  2. Oracle EBS渗透测试工具
  3. 稳定wow60级服务器,魔兽怀旧服:永久60级怀旧服是什么体验?
  4. UML类关系(依赖,关联,聚合,组合,泛化,实现)
  5. 【通俗讲解】BP神经网络
  6. 深入理解计算机系统之旅(一)计算机系统漫游
  7. 折半搜索+洛谷 P2962 [USACO09NOV]Lights G
  8. 单链表的按位置插入和删除
  9. 学习python有哪些优势
  10. TensorFlow基础篇(一)——tf.train.exponential_decay()
  11. 安卓图片处理全解:获取视频的缩略图
  12. Java使用冒泡排序对数据进行排序,带注释
  13. 使用rapid-framework继承jsp页面
  14. 输出100以内的所有素数
  15. Linux驱动开发-编写MMA7660三轴加速度传感器
  16. Apple ASA归因技术支持
  17. 深度学习(九) GAN 生成对抗网络 理论部分
  18. Matplotlib之cmap趣味调色
  19. C++——素数(质数)专题训练
  20. int型和char型之间的类型转换

热门文章

  1. 光环:研发云搭建及人才梯队建设——姚冬
  2. 用大约 10 万字的内容对 Java 的核心知识点和常见的 1000 多道面试题,做了详细的介绍
  3. 【Rust日报】2020-01-27 QIP:Rust中的量子计算模拟
  4. G003-186-18
  5. Win XP中恢复受损的注册表
  6. 英特尔Intel CPU睿频原理探讨
  7. 学而思总裁曹允东谈创业:融资意识很重要
  8. 驾考计算机播报原理,科目三电子路考流程详解 考驾照的都看看!
  9. android通知栏设置,android系统通知栏提示消息
  10. deepinV20 显卡驱动 cuda10.2+cudnn配置