iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言的动态内存管理是什么意思
  • 726
分享到

C语言的动态内存管理是什么意思

2023-06-29 03:06:27 726人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关C语言的动态内存管理是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、动态内存分配(1)用malloc类的函数分配内存;(2)用这些内存支持应用程序;(3)用free

这篇文章将为大家详细讲解有关C语言的动态内存管理是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    一、动态内存分配

    • (1)用malloc类的函数分配内存;

    • (2)用这些内存支持应用程序;

    • (3)用free函数释放内存。

    内存的简答来说的三大操作:分配----使用----释放

    内存管理指的是:分配— ----释放

    我们编写的程序代码:使用

    程序本质上就是处理数据,数据信息需要存放在内存里,就是用二极管表示的开断表示二进制数,进一步用二进制数表示万物:如音乐、文字、视频、图片、等等各种资源。

    分配–释放:为了更好的利用和回收内存资源,最大程度的发挥计算资源,统一操作系统来调度

    动态内存分配其实就要谈到自动内存分配

    自动分配:内存其实就是我们在编程文件里定义的变量实际在运行时映射的内存,这部分变量的内存都是由系统自动管理(分配-释放)。函数体(或者语句块)内的变量都是分布在函数  里面,运行时就会把这个帧插入到函数运行栈里,内存这些都由系统分拨,运行完就出栈,内存也被操作系统回收,一致到主函数出栈,程序退出。

    动态分配:就是我们自己手动申请操作系统给我们程序分配的内存,内存区域主要在于  上,这部分资源是我们手动申请和回收的。分配到的资源是我们来操作、存放数据的地方。

    实际上我们定义的变量最后也会被翻译为地址,都是通过寻址来操作变量的值(可以去看看汇编语言)

    #include <stdio.h>#include <stdlib.h> int main(void){int*pi=(int*)malloc(sizeof(int));*pi=5;printf("*pi:%d\n",*pi);free(pi); return 0;}

    C语言的动态内存管理是什么意思

    注意点

    int *pi=(int)malloc((4));

    • 然而,依赖于系统所用的内存模型,整数的长度可能会发生变化。可移植的方法是使用sizeof操作符,这样不管程序在哪里运行都会返回正确的长度。

    • 使用(int)malloc(number * (sizeof(int)));*

    二、动态内存分配函数

    有几个内存分配函数可以用来管理动态内存,虽然具体可用的函数取决于系统,但大部分系统的stdlib.h头文件中都有如下函数:

    malloc()

    realloc()

    calloc()

    函数描述
    malloc从堆上分配内存
    realloc在之前分配的内存块的基础上,将内存重新分配为更大或者更小的部分
    calloc从堆上分配内存并清零

    1、malloc()

    malloc函数从堆上分配一块内存,所分配的字节数由该函数唯一的参数指定,返回值是void指针,如果内存不足,就会返回NULL。此函数不会清空或者修改内存。

    声明:voidmalloc(size_t);

    • (1)从堆上分配内存;

    • (2)内存不会被修改或是清空;

    • (3)返回首字节的地址。

    实例用法int* pi=(int*)malloc(sizeof(int));

    因为当malloc无法分配内存时会返回NULL,在使用它返回的指针之前先检查NULL是不错的做法,如下所示:

    int*pi=(int*)malloc(sizeof(int));if(pi!=NULL){//指针没有问题}else{//无效的指针}
    • (4)静态、全局指针和malloc

    初始化静态或全局变量时不能调用函数。下面的代码声明一个静态变量,并试图用malloc来初始化:

    *static int pi = malloc(sizeof(int));

    这样会产生一个编译时错误消息,全局变量也一样。

    对于静态变量,可以通过在后面用一个单独的语句给变量分配内存来避免这个问题。但是全局变量不能用单独的赋值语句,因为全局变量是在函数和可执行代码外部声明的,赋值语句这类代码必须出现在函数中:

    static int *pi;
    pi = malloc(sizeof(int)); 

    2、realloc()

    声明:void *realloc(void *ptr,size t size);

    realloc函数返回指向内存块的指针。该函数接受两个参数,第一个参数是指向原内存块的指针,第二个是请求的大小。重新分配的块大小和第一个参数引用的块大小不同。返回值是指向重新分配的内存的指针。

    第一个参数第二个参数行为
    同malloc
    非空0原内存块被释放
    非空比原内存块小利用当前的块分配更小的块
    非空比原内存块大要么在当前位置要么在其他位置分配更大的块

    C语言的动态内存管理是什么意思

    堆管理器可以重用原始的内存块,且不会修改其内容。不过程序继续使用的内存超过了所请求的8字节。也就是说,我们没有修改字符串以便它能装进8字节的内存块中。在本例中,我们本应该调整字符串的长度以使它能装进重新分配的8字节。实现这一点最简单的办法是将NUL赋给地址507。实际使用的内存超出分配的内存不是个好做法,应该避免。

    C语言的动态内存管理是什么意思

    3、calloc()

    calloc函数在申请内存时会清空内存【清空内存的意思是将其内容置为二进制0】

    声明: void *calloc(size_t numElements,size_t elementSize);

    calloc函数会根据numElements和elementSize两个参数的乘积来分配内存,并返回一个指向内存的第一个字节的指针。如果不能分配内存,则会返回NULL。此函数最初用来辅助分配数组内存。

    如果numElements或elementSize为0,那么calloc可能返回空指针。如果calloc无法分配内存就会返回空指针,而且全局变量errno会设置为ENOMEM(内存不足),这是POSIX错误码,有的系统上可能没有。

    三、用free函数释放内存

    有了动态内存分配,程序员可以将不再使用的内存返还给系统,这样可以释放内存
    留作他用。通常用free函数实现这一点,该函数的原型如下:

    声明: void free(void *ptr);

    指针参数应该指向由malloc类函数分配的内存的地址,这块内存会被返还给堆。尽管指针仍然指向这块区域,但是我们应该将它看成指向垃圾数据。稍后可能重新分配这块区域,并将其装进不同的数据。

    C语言的动态内存管理是什么意思

    要点

    • 释放含义:指的是释放堆上的申请内存,其实就是告诉堆管理器,这个资源我不用了,可以回收了

    • 本地还是保留了之前申请内存的地址,这个地址我们应该避免去使用,也就是置这个指针为NULL

    • 不能再去接引已释放资源指针的值

    • 不能重复多次释放指针指向的内存(free)

    四、迷途指针

    如果内存已经释放,而指针还在引用原始内存,这样的指针就称为迷途指针。迷途指针没有指向有效对象,有时候也称为过早释放
    迷途指针带来的问题:

    • 如果访问内存,则行为不可预期;

    • 如果内存不可访问,则是段错误;

    • 潜在的安全隐患。

    造成的原因:

    • 访问已释放的内存;

    • 返回的指针指向的是上次函数调用中的自动变量;

    //第一种情况int*pi = (int*)malloc(sizeof(int));printf("*pi:%d\n",*pi);free(pi);*pi = 10; //第二种情况int*p1 = (int*)malloc(sizeof(int));*p1 = 5;int* p2;p2 = p1;free(p1);*p2 = 10;//迷途指针 //第三种情况int *pi;int tmp = 5;pi = &tmp;//这里pi变成了迷途指针foo();

    C语言的动态内存管理是什么意思

    关于“C语言的动态内存管理是什么意思”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    --结束END--

    本文标题: C语言的动态内存管理是什么意思

    本文链接: https://www.lsjlt.com/news/322075.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C语言的动态内存管理是什么意思
      这篇文章将为大家详细讲解有关C语言的动态内存管理是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、动态内存分配(1)用malloc类的函数分配内存;(2)用这些内存支持应用程序;(3)用free...
      99+
      2023-06-29
    • C语言动态内存管理的方法是什么
      本文小编为大家详细介绍“C语言动态内存管理的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言动态内存管理的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.为什么需要动态内存分配关于这个...
      99+
      2023-06-29
    • 【C语言进阶】动态内存管理
      动态内存管理 1.为什么存在动态内存分配2.动态内存函数的介绍2.1malloc和free2.2calloc2.3realloc 3.常见的动态内存错误3.1 对NULL指针的解引用操作...
      99+
      2023-10-25
      c语言 开发语言 1024程序员节
    • C语言动态内存管理介绍
      目录前言:C 语言为内存的分配和管理提供了几个函数:1.malloc() 用法2.calloc() 用法3.realloc() 与 free() 用法前言: 简单记录一下,内存管理...
      99+
      2022-11-12
    • C语言动态内存管理的实现
      目录1. 摘要2. 为什么存在动态内存管理3. 动态内存函数3.1 malloc3.2 free3.3 calloc3.4 realloc4. 常见的动态内存错误5. 几个经典笔试题...
      99+
      2022-11-12
    • C语言/C++内存管理是什么
      本篇内容介绍了“C语言/C++内存管理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、内存在计算机中,每个应用程序之间的内存是相互独...
      99+
      2023-06-16
    • 详解C语言之动态内存管理
      目录开辟动态内存的函数释放开辟的动态内存空间的函数错误信息函数具体使用例: 常见的动态内存错误总结先来了解一下动态管理内存所需用到的函数 开辟动态内存的函数 1.mallo...
      99+
      2022-11-12
    • 详解C语言中的动态内存管理
      目录一、动态内存管理1.1为什么要有动态内存管理1.2动态内存介绍1.3常见的动态内存错误一、动态内存管理 1.1为什么要有动态内存管理 1.1.1  在c语言中我们普通的...
      99+
      2022-12-12
      C语言动态内存管理 C语言 内存管理 C语言 内存
    • 关于C语言动态内存管理介绍
      目录1.为什么需要动态内存分配2.有关动态内存函数介绍2.1 malloc和free2.2 calloc函数2.3 realloc函数3. 常见的动态内存错误3.1 对NULL指针进...
      99+
      2022-11-13
    • C语言 动态内存管理全面解析
      目录1. 为什么存在动态内存分配2. 动态内存函数的介绍2.1 malloc和free2.2 calloc 2.3 realloc3. 常见的动态内存错误3.1 对NULL...
      99+
      2022-11-13
    • C语言动态内存管理分析总结
      目录什么是动态内存分配动态内存函数的介绍freemalloccallocrealloc动态内存管理中常见的错误对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用f...
      99+
      2022-11-12
    • C语言动态内存管理深入探讨
      目录1.动态内存开辟的原因2.动态内存函数的介绍2.1malloc和free2.2calloc2.3realloc3.常见的动态内存错误3.1对NULL指针的解引用操作3.2对动态开...
      99+
      2022-11-13
    • 深入了解C语言的动态内存管理
      目录一、为什么会存在动态内存二、动态内存函数1.malloc和free2.calloc3.realloc三、动态内存函数常见错误2.对NULL指针进行解引用操作3.使用free释放一...
      99+
      2022-11-13
    • C语言的动态内存管理你了解吗
      目录C/C++内存分配方式C++内存管理方式new和delete的使用new和delete的骚操作new和delete的区别重载new和delete定位new表达式内存泄露总结C/C...
      99+
      2022-11-13
    • C语言的动态内存管理的深入了解
      目录一、动态内存分配二、动态内存分配函数1、malloc()2、realloc()3、calloc()三、用free函数释放内存四、迷途指针总结一、动态内存分配 (1)用malloc...
      99+
      2022-11-13
    • C语言初识动态内存管理malloccallocreallocfree函数
      目录一、为什么存在动态内存分配二、动态内存函数的使用1.malloc函数(1)malloc的定义(2)malloc函数的注意事项(3)malloc函数的使用2.calloc函数(1)...
      99+
      2022-11-13
    • C语言中动态内存管理实例分析
      今天小编给大家分享一下C语言中动态内存管理实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.动态内存开辟的原因常见的...
      99+
      2023-07-02
    • C语言中动态内存管理图文详解
      目录1.动态内存开辟的原因2.动态内存函数的介绍2.1malloc和free2.2calloc2.3realloc3.常见的动态内存错误3.1对NULL指针的解引用操作3.2对动态开...
      99+
      2022-11-13
    • C语言中动态内存管理的示例分析
      这篇文章主要介绍了C语言中动态内存管理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是动态内存分配我们都知道在C语言中,定义变量的时候,系统就会为这个变量分配内...
      99+
      2023-06-25
    • C语言动态内存管理malloc函数怎么使用
      这篇文章主要讲解了“C语言动态内存管理malloc函数怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言动态内存管理malloc函数怎么使用”吧!1.C语言动态内存管理库函数介绍1...
      99+
      2023-07-04
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作