深入了解C语言中的动态内存分配

 更新时间:2022年06月29日 15:24:32   作者:。菀枯。  
这篇文章主要为大家详细介绍了C语言中的动态内存分配,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,需要的可以参考一下

今天我们来学习一下C语言中的动态内存分配 开始学习吧

什么是动态内存分配

我们目前已经知道的内存开辟的方式有:

int val = 20;//在栈上开辟四个字节。
char arr[10]  = { 0 };//在栈上开辟十个字节的连续空间

但是上述空间的开辟方式有两个特点:

1.空间开辟的大小是固定的

2.数组在申明的时候,必须指定数组长度,它所需内存在编译时分配。

显然,这样无法满足有些场景的要求,有时我们所需要的空间大小只有在程序运行的时候才知道。这时我们就需要用到动态内存分配了。

如何进行动态内存分配

首先我要介绍两个函数 malloc 和 free

void* malloc(size_t size);

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

  • 如果开辟成功,则返回一个指向开辟好空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
  • 返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者来决定
  • 如果参数size为0,malloc的行为是标准未定义的,取决于编译器。

现在我们知道了如何去开辟空间,接下来,我们去学习一下如何将开辟的空间释放掉。

void free(void* ptr);

C语言提供了另外一个函数free是专门用来释放动态内存的

  • 如果参数ptr指向的空间不是动态内存开辟的,那么free的行为是未定义的。
  • 如果参数ptr是NULL指针,那么函数什么都不会做。

想使用malloc 和 free 都需要引入一个头文件<stdlib.h>

接下来让我们看个示例:

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

int main()
{
    int num = 0;
    scanf("%d", &num);
    int *ptr = (int*)malloc(sizeof(int) * num);
    //判断是否开辟成功
    if(NULL != ptr)
    {
        int i = 0;
        for(i = 0; i < num; i++)
        {
            *(ptr + i) = 0;
        }
    }
    free(ptr);//释放空间
    ptr = NULL;
    return 0;
}

第二个开辟空间的动态内存分配的函数 calloc

void* calloc(size_t num, size_t size);

函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节都初始化为0

malloc与calloc的区别在于calloc会在返回地址之前把申请的空间的每个字节都初始化为0

举个例子:

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

int main()
{
    int *p = (int*)calloc(10, sizeof(int));
    if(NULL != p)
    {
        int i = 0;
        for(i = 0; i < 10; i++)
        {
            *(ptr + i) = 0;
        }
    }
    free(p);
    p = NULL;
    retrun 0;
}

所以如果我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成任务。

大小修改函数realloc

有时候我们会发现之前申请的空间太小,有时又会觉得申请的空间过大,那为了合理的使用内存,我们一定会对内存的大小做灵活调整。realloch函数就可以对动态开辟的内存大小进行调整

void* realloc(void* ptr, size_t size);
  • ptr 是要调整的内存地址
  • size 调整之后的新大小
  • realloc在调整内存空间后的返回值有两种情况

情况一:原有空间之后有足够大的空间,要扩展内存就直接在原有内存之后追加空间,原有空间的数据不变。

情况二:原有空间之后无足够大的空间,扩展方法是在堆上另找一块连续的空间来使用,这样函数返回的就是一个新的内存地址

以上就是深入了解C语言中的动态内存分配的详细内容,更多关于C语言 动态内存分配的资料请关注脚本之家其它相关文章!

相关文章

  • C\C++实现读写二进制文件的方法详解

    C\C++实现读写二进制文件的方法详解

    这篇文章主要为大家详细介绍了C\C++实现读写二进制文件的方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C语言中一些将字符串转换为数字的函数小结

    C语言中一些将字符串转换为数字的函数小结

    这篇文章主要介绍了C语言中一些将字符串转换为数字的函数小结,分别为atoi()函数和atol()函数以及atof()函数,需要的朋友可以参考下
    2015-08-08
  • 深入探讨C++ OpenCV如何实现图像矫正

    深入探讨C++ OpenCV如何实现图像矫正

    这篇文章主要为大家详细介绍了C++ OpenCV如何实现简单的图像矫正功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • VC++ 获取系统时间的方法汇总

    VC++ 获取系统时间的方法汇总

    本文给大家汇总介绍了5种VC++中获取系统时间的方法,十分的简单实用,有需要的小伙伴可以参考下。
    2015-07-07
  • C++报错:Segmentation Fault的解决方案

    C++报错:Segmentation Fault的解决方案

    段错误(Segmentation Fault)是 C++ 编程中常见且令人头疼的错误之一,段错误通常发生在程序试图访问未被允许的内存区域时,导致程序崩溃,本文将深入探讨段错误的产生原因、检测方法及其预防和解决方案,需要的朋友可以参考下
    2024-07-07
  • C语言判断字符串是否回文三种方法实例

    C语言判断字符串是否回文三种方法实例

    回文就是字符串中心对称,从左向右读和从右向左读的内容是一样的,下面这篇文章主要给大家介绍了关于C语言判断字符串是否回文的三种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • C语言实现括号配对的方法示例

    C语言实现括号配对的方法示例

    本文主要介绍了C语言实现括号配对的方法示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 一文详解C++中运算符的使用

    一文详解C++中运算符的使用

    这篇文章主要为大家详细介绍了C++中运算符的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-05-05
  • VS2019如何创建C++项目的实现示例

    VS2019如何创建C++项目的实现示例

    这篇文章主要介绍了VS2019如何创建C++项目的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • C语言中static的使用介绍

    C语言中static的使用介绍

    大家好,本篇文章主要讲的是C语言中static的使用介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12

最新评论