广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中动态内存的示例分析
  • 317
分享到

C语言中动态内存的示例分析

2023-06-29 10:06:54 317人浏览 八月长安
摘要

这篇文章主要为大家展示了“C语言中动态内存的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中动态内存的示例分析”这篇文章吧。1.关于动态内存的函数1.1 malloc和free函数

这篇文章主要为大家展示了“C语言中动态内存的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中动态内存的示例分析”这篇文章吧。

1.关于动态内存的函数

1.1 malloc和free函数

malloc这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针,如果开辟成功,则返回一个指向开辟好空间的指针;如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。

free函数专门是用来做动态内存的释放和回收的。如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的;如果参数 ptr 是NULL指针,则函数什么事都不做。
 

C语言中动态内存的示例分析

C语言中动态内存的示例分析

说明:

该函数设计的巧妙的一点就是返回值为void*,因为函数创造者并不知道使用者是想以什么样的类型指针来接收动态开辟的空间,所以使用者在使用时只需要强行转换成自己想要的类型就可以:

int* p = (int*)malloc(40);//假设是整型时的例子

在使用完动态开辟的空间后记得要用free函数向操作系统释放开辟的空间,并且将指针赋为空指针:

int* p = (int*)malloc(40); //...... free(p);//避免内存泄漏p = NULL;//原指针指向的位置既然已经还给操作系统的,就将指针赋为空指针,避免野指针等问题

 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

需要引头文件stdlib.h

1.2 calloc函数

C语言中动态内存的示例分析

 calloc可与malloc函数相对照来学习,calloc函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。与malloc有两点不同:

参数不同,calloc需要指明开辟空间的数据类型和该类型数据的个数,而malloc是全部字节数;

calloc在开辟空间的同时将空间内的全部字节初始化为0.

C语言中动态内存的示例分析

1.3 realloc函数

C语言中动态内存的示例分析

 realloc函数用来调整开辟空间的大小,有时可能开辟的空间小了,有时候可能开辟的大了,都可以通过realloc函数来修改,并且会将原来内存中的数据移动到新的空间。

realloc在调整空间大小时有两种情况:

原有空间后有足够大的空间,这种情况下扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化,返回值为原来位置的指针;

C语言中动态内存的示例分析

 2.原有空间后没有足够大的空间,这时便在堆空间找到大小合适的连续空间使用,并将原有空间的数据转移到新的空间返回值为新空间的地址。

C语言中动态内存的示例分析

int main(){    int *str = (int*)malloc(10);    if(str != NULL){    //.....}else{    exit(EXIT_FAILURE);}    //扩展容量//代码1str = (int*)realloc(str, 1000);//这样可以吗?(如果申请失败会返回一个空指针!!!)  //修改代码2int*p = NULL;p = realloc(str, 1000);if(p != NULL){    str = p;}//...free(str);return 0;}

2.常见的动态内存错误

2.1 对NULL指针解引用

int* p = (int*)malloc(40);*p=10;free(p);

这就是忽略了返回值可能是空指针的可能,如果开辟失败会返回空指针。所以最好的做法就是判断一下指针是否为空,然后再进行下一步。

int* p = (int*)malloc(40);if(p != NULL){    *p=10;}free(p);

2.2 对动态内存开辟的空间越界访问

就类似于使用数组时对数组越界访问。

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

2.3 对非动态开辟内存使用free释放

int a = 0;int* p = &a;free(p);

通过查阅MSDN可以发现:Attempting to free an invalid pointer (a pointer to a memory block that was not allocated by calloc, malloc, or realloc) may affect subsequent allocation requests and cause errors. 就是说如果用free释放非calloc,malloc,realloc函数动态开辟的空间可能会导致后续的分配请求并且导致错误。

2.4 使用free释放一块动态开辟内存的一部分

int *p = (int *)malloc(100);p++;free(p);//p不再指向动态内存的起始位置

会导致动态开辟的空间无法完全释放,进而可能会导致内存泄漏。

2.5 对同一块动态内存多次释放

int *p = (int *)malloc(10);free(p);free(p);//重复释放

2.6 内存泄漏

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

如果使用完动态内存又不释放则会导致这块内存无法在后续被利用,导致内存泄漏。动态开辟的空间一定要释放,并且正确释放。

补充:为什么要引入动态内存分配

1.指针只能指向一个确切的内存空间,欲使用一个数据,必须先设定一个变量来保存它么?

2.在程序设计时,数据多为动态的。即程序运行时数据项的数量是变化的。

3.用数组保存多个元素时,很难预知实际运行时存储的元素个数,往往会导致预定义的元素个数不足或过多

例如:电话簿的管理程序。当添加新联系人时,数据项将增加;删除联系人时,数据项将减少。

动态数据结构可以在运行时灵活地添加、删除或重排数据项。
动态内存管理可以在运行时分配更多的内存空间或释放掉不再需要的空间,因而可以优化存储空间的使用。

所以&mdash;&mdash;&mdash;由于无法预知在运行时数组元素的使用情况,在程序中预定义的数组大小,如果过小,会导致程序运行失败;如果过大,则会浪费内存空间。

如果在运行时根据实际需要来决定内存的使用情况,则可以很好的解决以上问题。

以上是“C语言中动态内存的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网其他教程频道!

--结束END--

本文标题: C语言中动态内存的示例分析

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

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

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

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

下载Word文档
猜你喜欢
  • C语言中动态内存的示例分析
    这篇文章主要为大家展示了“C语言中动态内存的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中动态内存的示例分析”这篇文章吧。1.关于动态内存的函数1.1 malloc和free函数...
    99+
    2023-06-29
  • C语言中动态内存管理的示例分析
    这篇文章主要介绍了C语言中动态内存管理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是动态内存分配我们都知道在C语言中,定义变量的时候,系统就会为这个变量分配内...
    99+
    2023-06-25
  • C语言中的动态内存分配实例分析
    本篇内容主要讲解“C语言中的动态内存分配实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中的动态内存分配实例分析”吧!什么是动态内存分配我们目前已经知道的内存开辟的方式有:int&n...
    99+
    2023-07-02
  • C语言中动态内存管理实例分析
    今天小编给大家分享一下C语言中动态内存管理实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.动态内存开辟的原因常见的...
    99+
    2023-07-02
  • C语言编程C++动态内存分配示例讲解
    目录动态内存管理为什么存在动态内存分配动态内存函数的介绍malloc申请空间和free释放空间有借有还 free释放内存calloc申请内存realloc调整动态内存的大小reall...
    99+
    2022-11-12
  • C语言动态内存管理实例代码分析
    这篇文章主要介绍了C语言动态内存管理实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言动态内存管理实例代码分析文章都会有所收获,下面我们一起来看看吧。1.动态内存开辟的原因常见的内存开辟方式int...
    99+
    2023-07-02
  • C语言动态内存的分配最全面分析
    目录为什么有动态内存分布malloc函数的使用free函数的用法calloc的用法realloc的使用方法柔性数组为什么有动态内存分布 大家发现一个问题没有,就是我们之前写代码创建数...
    99+
    2022-11-13
  • C语言动态内存管理分析总结
    目录什么是动态内存分配动态内存函数的介绍freemalloccallocrealloc动态内存管理中常见的错误对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用f...
    99+
    2022-11-12
  • C语言动态内存的分配实例详解
    目录前言动态内存分配的定义动态内存的优势<1>  可以控制内存的大小<2> 可以多次利用这部分空间<3>不占用栈区的内存malloc c...
    99+
    2022-11-13
  • C语言中数据存储的示例分析
    这篇文章主要介绍了C语言中数据存储的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。(壹)大端小端藏端倪1.1  什么是大端小端大端(存储)模式,是指数据的低...
    99+
    2023-06-29
  • C语言的动态内存如何分配
    今天小编给大家分享一下C语言的动态内存如何分配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。动态内存分配的定义首先我们要搞清...
    99+
    2023-07-02
  • 详解C语言动态内存的分配
    目录C 程序中,不同数据在内存中分配说明内存动态分配的相关函数应用实例动态分配内存的基本原则总结C 程序中,不同数据在内存中分配说明 1)全局变量——内存中的...
    99+
    2022-11-12
  • C语言的动态内存分配及动态内存分配函数详解
    目录mallocmalloc的使用:freecalloccalloc的使用:reallocrealloc的使用改进:realloc的另一种用法:常见的动态内存错误对空指针的解引用操作...
    99+
    2022-11-13
  • AndroidNDK开发(C语言--动态内存分配)
    1.C 内存管理函数 C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 ...
    99+
    2022-11-12
  • 超详细分析C语言动态内存管理问题
    目录一、为什么存在动态内存的分配二、动态内存函数的介绍2.1 malloc和free2.2 calloc2.3 realloc三、常见的动态内存错误3.1 对NULL指针的解引用操作...
    99+
    2022-11-13
  • C语言中关于动态内存分配的详解
    目录一、malloc 与free函数二、calloc三、realloc四、常见的动态内存的错误【C语言】动态内存分配 本期,我们将讲解malloc、calloc、realloc以及f...
    99+
    2022-11-12
  • 深入了解C语言中的动态内存分配
    目录什么是动态内存分配如何进行动态内存分配首先我要介绍两个函数 malloc 和 free第二个开辟空间的动态内存分配的函数 calloc大小修改函数realloc今天我们来学习一下...
    99+
    2022-11-13
  • C语言中动态内存分配malloc、calloc和realloc函数解析
    目录前言free函数malloc函数calloc函数realloc函数扩充malloc/calloc/realloc区别总结总结前言 有时候我们需要的空间大小不确定,需要随着程序需要...
    99+
    2022-11-13
  • C语言中循环的示例分析
    这篇文章主要为大家展示了“C语言中循环的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中循环的示例分析”这篇文章吧。(壹)while语句1.1while的执行流程比如我们实现:在屏...
    99+
    2023-06-29
  • C语言中队列的示例分析
    这篇文章将为大家详细讲解有关C语言中队列的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、队列(Queue)0x00 队列的概念 概念:① 队列只允许在一端进行插入数据操作,在另一端进...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作