广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中关于动态内存分配的详解
  • 231
分享到

C语言中关于动态内存分配的详解

2024-04-02 19:04:59 231人浏览 泡泡鱼
摘要

目录一、malloc 与free函数二、calloc三、realloc四、常见的动态内存的错误【C语言】动态内存分配 本期,我们将讲解malloc、calloc、realloc以及f

C语言】动态内存分配

本期,我们将讲解malloc、calloc、realloc以及free函数。

这是个动态内存分配函数的头文件都是 <stdlib.h>。

c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?

首先让我们熟悉一下计算机的内存吧!在计算机的系统中大致有这四个内存区域:

1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);

2)字符常量区:主要是储存一些字符常量,比如:char *p=”hello world”;其中”hello world”就储存在字符常量区里面;

3)全局区:在全局区里储存一些全局变量和静态变量;

堆:堆主要是通过动态分配的储存空间,也就是我们接下需要讲的动态分配内存空间。

静态内存和动态内存的比较:

  • 静态内存是有系统自动分配,由系统自动释放。 静态内存是在栈分配的。(例如:函数里的局部变量)
  • 动态内存是由程序员手动分配,手动释放。 动态内存是在堆分配的。(例如:用C语言写链表时,需要自己对node结点分配内存空间)

一、malloc 与free函数

void* **malloc( size_t ** size);

返回类型: void*,也就是说这个函数的可以返回所有类型的指针形式。只需要在开辟空间的时候进行强制类型转换一下即可。

函数参数:size_t size, 这个参数就是告诉这个函数,你需要开辟多少个字节的内存空间。

void free(void* memblock) ;

没有返回参数。

函数参数:void* memblock, free函数可以接收来自所有类型指针的 动态分配 的 内存空间。

一切以栗子来描述吧:


#include <stdlib.h>
#include <stdio.h>
int main()
{
    //开辟10个int类型的空间
    int* arr = (int*)malloc(10 * sizeof(int)); //切记这里给的大小,是10  *  int(4个字节)
    int i = 0;
    if (arr == NULL)
    {
        perror("malloc"); //有可能,malloc开辟空间失败,则malloc会返回NULL
        return 1;
    }
    
    for (i = 0; i < 10; i++)
        *(arr + i) = i; //放入数据 0 …… 9
    
    for (i = 0; i < 10; i++)
        printf("%d ",*(arr + i));
    
    //记得释放所开辟的空间
    free(arr); 
    return 0;
}

二、calloc

void* calloc (size_t num, size_t** size );

返回类型:与malloc函数是一样的,就不在多说了。

函数参数:size_t num, 需要开辟多少个元素的空间。

​ size_ size, 每一个元素,所占用的内存空间是多少个字节。

注:与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

栗子:


#include <stdlib.h>
#include <stdio.h>

int main()
{
    //还是申请10个int类型的内存空间
    int* arr = (int*)calloc(10, sizeof(int));
    if (arr == NULL)
    {
        perror("calloc"); //calloc开辟空间的话,会返回NULL
        return 1;
    }
    
    //不做赋值运算,直接输出刚开辟的空间,看是否是已经初始化为0了
    int i = 0;
    for (i = 0; i < 10; i++)
        printf("%d ",*(arr + i));
    
    //记得释放空间
    free(arr);
    return 0;
}


三、realloc

void* **realloc(*void memblock, size_t size);

作用: Reallocate memory blocks.(重新分配内存块)

  • memblock是需要调整的内存地址
  • size调整之后新大小
  • 返回值为调整之后的内存起始位置。
  • 这个函数调整原内存空间大小的基础_上,还会将原来内存中的数据移动到新的空间。
  • realloc在调整内存空间的是存在两种情况:

​ 情况1 :原有空间之后有足够大的空间

假设我还想为“红色框内的内存空间,扩大一倍,并且在这块空间的后面,是有足够的空间。所有realloc函数会在这紧挨这红色框后面直接开辟空间。并且返回的还是红色框的首元素地址。

情况2: 原有空间之后没有足够大的空间

此时,如果我还想为红色框的内存空间进行扩大,此时红色框后面紧挨着的空间已经被其他程序所占用了,此时想开辟空间的话,只能将现在这块空间先释放掉(realloc会自动释放),再去其他大一点的地方进行开辟空间。

如图:

注:realloc函数,有一个很值得注意的地方,看如下代码:


int main()
{
    int* arr = (int*)malloc(5 * sizeof(int)); //先开辟5个int类型的空间
    if (arr == NULL)
        return 1;
    
    //此时,我觉得malloc开辟的空间小了,我想增加
    arr = (int*) realloc(arr, 10);
    
    free(arr);
    return 0;
}

大家觉得,这段代码,有什么弊端?

分析:

在第8行,realloc函数,去调整arr的空间。他是先查看arr后面的内存空间是否够用,如果不够用的话,会去寻找其他大一点的地方去开辟空间。假设此时我的内存已经满了,此时realloc返回的是NULL。

也就是说,我本来想增容,结果没增成功,还把以前空间里的数据弄丢了。

所以在使用realloc函数时,先使用一个临时变量进行保存一下,如果返回不是NULL,我们在把返回的内存地址赋值给arr即可。

如下:


int main()
{
    int* arr = (int*)malloc(5 * sizeof(int)); //先开辟5个int类型的空间
    if (arr == NULL)
        return 1;
    
    //此时,我觉得malloc开辟的空间小了,我想增加
    int* tmp = NULL;
    tmp = (int*) realloc(arr, 10);
    if (tmp != NULL)
        arr = tmp;
    
    free(arr);
    return 0;
}

四、常见的动态内存的错误

  • 对NULL进行解引用操作

int main()
{
    int* arr = (int*)malloc(10 * sizeof(int));
    *arr = 10; //没有对arr进行NULL的判断
    free(arr);
    return 0;
}
  • 对非动态内存分配的空间进行free释放

int main()
{
    int a = 10;
    int* pa = &a;
    free(pa); //pa指针,并不是malloc等函数开辟的空间,不能使用free释放,系统会自动回收的
    return 0;
}
  • 使用free函数释放一块动态分配空间的一部分

int main()
{
    int* arr = (int*)malloc(10 * sizeof(int));
    if (arr == NULL)
        return 1;
    arr++; //此时,arr向后跳了4个字节
    free(arr); //现在再去释放空间,最前面的4个字节的空间就没有释放到,会报错
    return 0;
}
  • 对同一块内存空间进行多次释放

int main()
{
    int* arr = (int*)malloc(10 * sizeof(int));
    if (arr == NULL)
        return 1;
    
    free(arr);
    free(arr); //重复释放了
    return 0;
}
  • 动态开辟的空间忘记释放(内存泄漏)

int main()
{
    int* arr = (int*)malloc(10 * sizeof(int));
    if (arr == NULL)
        return 1;
    
    //没有释放空间,会造成内存泄漏
    //造成内存泄漏,有很多原因,例如,在调用其他函数时,想传回到本函数,指针没用正确,导致开辟的空间没有传回来等等
    return 0;
}

注: 动态开辟的内存空间,切记 一定要释放。不然后果很严重的!!!

本期更新就完啦!!!我们下期见啦

main()
{
int* arr = (int*)malloc(10 * sizeof(int));
if (arr == NULL)
return 1;

}


  //没有释放空间,会造成内存泄漏
  //造成内存泄漏,有很多原因,例如,在调用其他函数时,想传回到本函数,指针没用正确,导致开辟的空间没有传回来等等
  return 0;

注: 动态开辟的内存空间,切记 一定要释放。不然后果很严重的!!!

本期更新就完啦!!!我们下期见啦

到此这篇关于C语言中关于动态内存分配的详解的文章就介绍到这了,更多相关C语言 动态内存分配内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言中关于动态内存分配的详解

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

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

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

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

下载Word文档
猜你喜欢
  • C语言中关于动态内存分配的详解
    目录一、malloc 与free函数二、calloc三、realloc四、常见的动态内存的错误【C语言】动态内存分配 本期,我们将讲解malloc、calloc、realloc以及f...
    99+
    2022-11-12
  • 详解C语言动态内存的分配
    目录C 程序中,不同数据在内存中分配说明内存动态分配的相关函数应用实例动态分配内存的基本原则总结C 程序中,不同数据在内存中分配说明 1)全局变量——内存中的...
    99+
    2022-11-12
  • C语言的动态内存分配及动态内存分配函数详解
    目录mallocmalloc的使用:freecalloccalloc的使用:reallocrealloc的使用改进:realloc的另一种用法:常见的动态内存错误对空指针的解引用操作...
    99+
    2022-11-13
  • C语言动态内存的分配实例详解
    目录前言动态内存分配的定义动态内存的优势<1>  可以控制内存的大小<2> 可以多次利用这部分空间<3>不占用栈区的内存malloc c...
    99+
    2022-11-13
  • 深入了解C语言中的动态内存分配
    目录什么是动态内存分配如何进行动态内存分配首先我要介绍两个函数 malloc 和 free第二个开辟空间的动态内存分配的函数 calloc大小修改函数realloc今天我们来学习一下...
    99+
    2022-11-13
  • C语言动态内存分配图文讲解
    目录思维导图1.为什么存在动态内存分配2.动态内存函数的介绍2.1 malloc2.2 free2.3 calloc2.4 realloc3.常见的动态内存错误思维导图 1.为什么...
    99+
    2023-01-17
    C语言动态内存分配 C语言动态内存分配函数
  • C语言的动态内存如何分配
    今天小编给大家分享一下C语言的动态内存如何分配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。动态内存分配的定义首先我们要搞清...
    99+
    2023-07-02
  • 关于C语言动态内存管理介绍
    目录1.为什么需要动态内存分配2.有关动态内存函数介绍2.1 malloc和free2.2 calloc函数2.3 realloc函数3. 常见的动态内存错误3.1 对NULL指针进...
    99+
    2022-11-13
  • c语言详解动态内存分配及常见错误的解决
    目录为什么会有动态内存分配动态内存函数的介绍malloc freecallocrealloc常见的错误对NULL指针的解引用操作越界访问对非动态内存进行free使用free...
    99+
    2022-11-13
  • C语言中的动态内存分配实例分析
    本篇内容主要讲解“C语言中的动态内存分配实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中的动态内存分配实例分析”吧!什么是动态内存分配我们目前已经知道的内存开辟的方式有:int&n...
    99+
    2023-07-02
  • 详解C语言中的动态内存管理
    目录一、动态内存管理1.1为什么要有动态内存管理1.2动态内存介绍1.3常见的动态内存错误一、动态内存管理 1.1为什么要有动态内存管理 1.1.1  在c语言中我们普通的...
    99+
    2022-12-12
    C语言动态内存管理 C语言 内存管理 C语言 内存
  • AndroidNDK开发(C语言--动态内存分配)
    1.C 内存管理函数 C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 ...
    99+
    2022-11-12
  • C语言动态内存函数详解
    目录动态开辟空间的原因 1、malloc函数2、free函数3、calloc函数4、realloc函数总结动态开辟空间的原因 静态开辟空间是固定的,数组在申明的时候必须指定数组的长...
    99+
    2022-11-12
  • C语言动态开辟内存详解
    目录1.动态内存管理2.动态开辟内存函数的介绍2.1malloc和free函数2.2calloc函数2.3relloc函数总结1.动态内存管理 我们已经掌握的内存开辟方法,用的最多的...
    99+
    2022-11-13
  • C语言动态内存规划详解
    目录动态内存规划动态内存函数的介绍总结动态内存规划 用C语言写程序时,因为语言的一些特性使用数组的时候只能用常量来申明数组,就导致数组的内存被卡得很死,不能根据我们的实际需求灵活的使...
    99+
    2022-11-12
  • C语言编程C++动态内存分配示例讲解
    目录动态内存管理为什么存在动态内存分配动态内存函数的介绍malloc申请空间和free释放空间有借有还 free释放内存calloc申请内存realloc调整动态内存的大小reall...
    99+
    2022-11-12
  • 关于C语言中数据在内存中的存储详解
    目录前言一、数据类型介绍1.类型的基本归类1.整形家族2.浮点型家族3.构造类型4.指针类型5.空类型二、整型在内存中的存储1.原码、反码、补码2.内存中怎样存储3.大小端字节序1....
    99+
    2022-11-12
  • C语言动态内存的分配最全面分析
    目录为什么有动态内存分布malloc函数的使用free函数的用法calloc的用法realloc的使用方法柔性数组为什么有动态内存分布 大家发现一个问题没有,就是我们之前写代码创建数...
    99+
    2022-11-13
  • C语言动态内存分配怎么使用
    这篇文章主要介绍了C语言动态内存分配怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言动态内存分配怎么使用文章都会有所收获,下面我们一起来看看吧。一、动态内存分配的意义C语言中的一切操作都是基于内存的...
    99+
    2023-06-30
  • C语言如何实现动态内存分配
    今天小编给大家分享一下C语言如何实现动态内存分配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。C语言动态内存分配的详解1.为...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作