动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小

上面是对于动态内存分配的介绍。下面说一下C语言与C++的动态内存分配的区别:

  1. c中 函数 malloc-free 是函数;c++中 关键字 new-delete 是关键字。
  2. malloc 不能给创建的空间初始化。返回值是void*,不能直接使用;
    new 可以给创建的空间初始化。返回的是指针,是创建空间类型的指针。

在说动态内存分配之前我觉得有必要说一下内存空间的生命周期。

  1. 堆: 自定义的 malloc创建 free释放,要避免内存泄漏(只创建不释放)。
  2. 栈:定义变量的作用域开始执行创建,执行结束释放。
  3. 静态: 程序运行时创建(或者第一次使用时创建),程序结束释放。

下面先说下C语言的动态内存分配。
malloc为动态内存分配, 当分配成功时,就返回 这块内存的首地址。

int *p = malloc(100 * sizeof(int));//整型的动态内存分配格式。
char *p = malloc(100 * sizeof(char));//字符型的动态内存分配格式
注:malloc前最好加上类型,例如:(char*)malloc(100 * sizeof(char));

现在说一道例题:学生人数由输入确定,动态分配内存,保存学生成绩,然后求出学生平均成绩

#include <stdio.h>
#include <stdlib.h>
int main()
{int n, i, sum = 0;scanf("%d", &n);int *p = malloc(n * sizeof(int));//分配地址,分配了n个intfor(i = 0; i < n; i++)//简单for循环{scanf("%d", &p[i]);//输入学生成绩sum += p[i];}printf("avg is %d\n", sum / n);
}

注:
1动态内存分配,不会自动释放,需要在程序里释放 ,这时就需要“free”,通常 malloc 和 free要成对出现。

free(p);

2动态内存分配可能会不成功,如果分配失败,malloc返回值为NULL,所以,分配后要检查p是不是NULL。

下面再写一道题目:输出学生成绩(动态分配):输入学生人数后输入每个学生的成绩,最后输出学生的平均成绩、最高成绩和最低成绩。要求使用动态内存分配来实现。

#include<stdio.h>
#include<stdlib.h>
int main ( )
{int n, i;float *p, sum, max, min;//定义变量printf("请输入学生的人数: ");scanf("%d", &n);if ((p=malloc(n*sizeof(float))) == NULL) //报错提醒,同时动态分配n个float型内存{printf("WOW!ERROR \n");exit(1);}sum=0;//初始化max=-1;//初始化min=1000;//初始化printf("请录入 %d 个成绩: ", n);for (i = 0; i < n; i++){scanf("%f", p+i);sum=sum+*(p+i);if (min>*(p+i))min=*(p+i);if (max<*(p+i))max=*(p+i);}printf("平均分是 %f, 最高分是 %f, 最低分是 %f\n",sum/n,max,min);free(p);//释放内存return 0;
}

好了,关于C语言的动态内存分配先说这么多,下面说一说C++的动态内存分配。
C++的动态内存分配的格式是

int *p = new int; //在堆空间创建int类型变量,new的结果是int*类型,将结果赋值给p
/*c++中在创建堆空间变量时是可以对其进行初始化的,格式为*/
int* p1 = new int(10);//初始化10

同时,C++的动态内存同样需要释放,格式为

delete p;//释放p指向的堆空间的int变量

而在C++中动态分配数组的格式是

int* p = new int[10];//在堆空间创建10个int类型元素的数组

数组的释放格式为

delete[] p;//释放数组必须是delete[]

注: 不加[]编译运行是不会显示什么错误的,但是delete p仅仅释放了p数组的首元素,内存空间并没有释放完全。

最后举一个C++的动态内存分配题目:从键盘输入学生分数int 4 统计出最高分 最低分 平均分 要求:空间动态开辟new

#include <iostream>​
using namespace std;​​
int main()
{    int* p = new int[4];//动态分配四个int内存for(int i = 0;i < 4;i++)    {        cin>>p[i];//输入成绩}    int max = p[0], min = p[0], sum = p[0];//初始化for(int i = 1;i < 4;i++)    {        if(p[i] > max)        {            max = p[i];}        else if(p[i] < min)       {            min = p[i];        }        sum += p[i];    }    cout<<"max:"<<max<<"min:"<<min<<"avg:"<<sum/4<<endl;    return 0;
}

PS:关于C/C++的动态内存分配就先总结到这,关于C++的相关知识后续会整理出来。如有瑕疵还望评论区指正。Respect !

C/C++——动态内存分配相关推荐

  1. 释放变量所指向的内存_C++动态内存分配(学习笔记:第6章 15)

    动态内存分配[1] 动态申请内存操作符 new new 类型名T(初始化参数列表) 功能: 在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值. 结果值: 成功:T类型的指针,指向 ...

  2. 动态内存分配与柔性数组

    什么时动态内存分配 一般我们写程序都是在栈区分配空间,如果我们想根据需求想随时存放随时释放数据,堆区可以实现根据需求想系统申请所需大小的空间. 建立内存的动态分配 内存的动态分配是通过系统提供的函数来 ...

  3. C++中的动态内存分配

    1.Cpp中的内存分配 了解动态内存在C++中是如何工作的是成为一名合格的C++程序员必不可少的.C++程序中的内存分为两个部分: 栈:在函数内部声明的所有变量都将占用栈内存. 堆:这是程序中未使用的 ...

  4. 【 C 】动态内存分配实用案例(二)之复制字符串

    用动态分配内存制作一个字符串的一份拷贝.注意:调用程序应该负责检查这块内存是否分配成功,这样做允许程序以任何它所希望的方式对错误作出反应. #nclude <stdlib.h> #incl ...

  5. 【 C 】动态内存分配实用案例(一)之读取、排序和打印一列整形值

    什么时候用动态内存分配呢?下面这个案例给出了一个比较实用且精彩地使用动态内存的场合,并且教你如何合理地使用动态内存分配? 动态内存分配一个常见的用途就是为那些长度在运行时才知的数组分配内存空间. 下面 ...

  6. 【 C 】动态内存分配案例分析

    声明一个指向char类型的指针,可以在声明的时候就对其进行初始化,这样是合理的. 例如: E1: #include <stdio.h> #include <stdlib.h> ...

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

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

  8. 从更底层研究C\C++动态内存分配

    2019独角兽企业重金招聘Python工程师标准>>> 以前在学C++ 的时候,一直不懂:动态内存分配的本质,或者更加深入到底层的意义.虽然说,动态内存分配就是,随机在内存中分配一个 ...

  9. 静态、动态内存分配比较

    首先,在使用动态分配内存技术前,必须明白自己在做什么,这样做与其它的方法有什么不同,特别是会产生哪些负面影响,天下没有免费的午餐.动态分配内存与静态分配内存的区别: 1) 静态内存分配是在编译时完成的 ...

  10. 动态内存分配到底为谁分配内存空间【浅谈动态内存的一个实例】

    为了动态的管理宝贵的内存,许多程序中要使用到动态内存分配.一般情况下,在c语言中,使用malloc()函数来分配指定大小的内存空间,用free()函数来释放这块内存空间.但是,往往初学者在编写这类程序 ...

最新文章

  1. unbuntu下安装flash插件
  2. 2016江苏计算机二级考试时间,2016年江苏计算机二级考试报名时间_无忧考网.pdf...
  3. html-----020----事件
  4. Atitit.操作注册表 树形数据库 注册表的历史 java版本类库总结
  5. rest接口_深度干货 | 测试REST服务接口
  6. c语言选择结构程序if,C语言的选择结构 (if 语句 和 switch 语句)
  7. String的内存分配与拼接操作,华为架构师深入讲解Java开发
  8. 服务器装系统提示获取分区失败,u盘安装系统分区错误解决方法
  9. 使用shell脚本将mysql数据导入HIve中
  10. D3.js学习(一)
  11. 18. Magento 细节
  12. 玩转DataGridView之实现两个GRID间行的拖拽
  13. npm install 报错 npm ERR! errno ETIMEDOUT
  14. VTK: 拾取方式的三种实现
  15. ps 帧动画 也说 gif 动图
  16. 四面阿里Java高级研发岗,定级P7:数据结构+分布式+JVM+线程
  17. 使用Python修改可执行文件-EXE的图标
  18. 大学生计算机适合用苹果笔记本吗,2019学生党笔记本推荐 苹果笔记本适合大学生吗...
  19. PAT乙级(Basic Level)练习题 星际密码
  20. 985大学计算机考研难度排名2015,39所985院校考研难度排名,看看你是哪个档次?...

热门文章

  1. 【PHP MySQL】数据库专题 第二课 创建数据库 表
  2. 企业无线局域网的搭建
  3. OpenCV3.3.0 + CLion + CMake 配置(Mac巨细无敌版)
  4. 【Kevin Learn QMUI】-->qmui 知识梳理
  5. Linux环境中ElasticSearch启动时常见错误、解决
  6. C++类模板和模板类
  7. 《痞子衡嵌入式半月刊》 第 34 期
  8. 可以将TCP BBR算法模块化到低版本内核取代锐速吗
  9. 分享一个高清大图的网站
  10. 聚类分析经典算法(一)