C语言——动态内存函数(malloc、calloc、realloc、free)

2024-04-09 1577阅读

了解动态内存函数

  • 前言:
  • 一、malloc函数
  • 二、calloc函数
  • 三、realloc函数
  • 四、free函数

    前言:

    在C语言中,动态内存函数是块重要的知识点。以往,我们开辟空间都是固定得,数组编译结束后就不能继续给它开辟空间了,开辟的空间满了,就不能在开辟空间了(就是不能在添加数据了)。学习本文章,我们就可以解决这个问题,向内存申请空间,满啦可以继续申请空间。

    一、malloc函数

    需要头文件——

    C语言——动态内存函数(malloc、calloc、realloc、free)

    浏览器直接翻译:

    C语言——动态内存函数(malloc、calloc、realloc、free)

    malloc函数(动态内存开辟的函数):

    void* malloc(size_t size);
    

    功能:

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

    • 如果开辟成功,则返回一个指向开辟好空间的指针。
    • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
    • 返回值的类型是void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者自己决定。
    • 如果size为0,malloc的行为是标准还是未定义的,由编译器决定。
    • malloc申请的空间,当程序退出时,要还给操作系统,当程序不退出,动态申请的内存,不会主动释放,需要用free函数来释放。

      malloc申请的内存空间:

      malloc申请到空间后,直接返回这个空间的首地址,不会初始化空间的内容。

      举个例子:

      #include 
      #include 
      int main()
      {
      //变长数组的知识点(vs不能用,gcc可以用)
          //int num = 0;
          //scanf("%d", &num);
          //int arr[num] = { 0 };
          int* ptr = NULL;
          ptr = (int*)malloc(40);
          if (ptr == NULL)//判断ptr指针是否为空
          {
              perror("malloc");
              exit; 
          }
          else
          {
              int i = 0;
              for (i = 0; i  
      

      二、calloc函数

      需要头文件——

      C语言——动态内存函数(malloc、calloc、realloc、free)

      浏览器直接翻译:

      C语言——动态内存函数(malloc、calloc、realloc、free)

      calloc函数(动态内存分配函数):

      void* calloc(size_t num, size_t size);
      

      功能:

      • 函数的功能是,为num个大小为size元素开辟一块空间,并且把空间的每一个字节初始化为0.
      • 与malloc函数的区别,只在于calloc函数会在返回地址之前把申请空间的每一个字节初始化为0.

        举个例子:

        #include 
        #include 
        int main()
        {
            int* p = (int*)calloc( 10,sizeof(int));
            if (p == NULL)//成立,开辟失败
            {
                perror("calloc");
                exit;
            }
            free(p);
            p = NULL;
            return 0;
        }
        

        p指向的地址:

        C语言——动态内存函数(malloc、calloc、realloc、free)

        三、realloc函数

        需要头文件——

        C语言——动态内存函数(malloc、calloc、realloc、free)

        浏览器直接翻译:

        C语言——动态内存函数(malloc、calloc、realloc、free)

        realloc函数(动态内存管理更加灵活):

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

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

        功能:

        • ptr是要调整的内存地址。
        • size是调整后的新大小。
        • 返回值为调整之后的内存起始位置。
        • 这个函数在调整原空间大小的基础上,还会将原来的数据移到新的空间。

          注意:

          realloc调整内存空间有两种情况。

          • 情况1:原有空间之后有足够大的空间(原地扩容)。

            当是情况1的时候,要扩展内存就直接在原有内存之后直接追加空间,原来空间的数据不发生改变。

            C语言——动态内存函数(malloc、calloc、realloc、free)

          • 情况2:原有空间后面没有足够大的空间(异地扩容)。

            当是情况2的时候,原有空间后面没有足够多的空间时,扩展的方法是:在堆空间上另外找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。

            C语言——动态内存函数(malloc、calloc、realloc、free)

            所以我们在使用realloc函数的时候一定要注意:

            1、开辟新的空间。

            2、 会将旧的空间数据拷贝到新的空间。

            3、释放旧的空间。

            4、返回新空间的起始地址。

            举个例子:

            #include 
            #include 
            int main()
            {
                int* ptr =(int*) malloc( 100 );
                if (ptr != NULL)
                {
            //可以使用这个空间
                }
                else
                {
                    perror("malloc");
                    exit;
                }
                //扩展空间
                int* p = (int*)realloc(ptr, 1000);//可能增容失败
                if (p != NULL)
                {
                    //增容成功
                    ptr = p;//p指向的空间交给ptr去维护
                }
                free(ptr);//把开辟早堆上的空间释放掉
                ptr = NULL;
                return 0;
            }
            

            四、free函数

            需要头文件——

            C语言——动态内存函数(malloc、calloc、realloc、free)

            浏览器直接翻译:

            C语言——动态内存函数(malloc、calloc、realloc、free)

            free函数(释放动态开辟的内存):

            void* free(void* ptr);
            

            功能:

            • 如果参数ptr指向的那个空间不是动态开辟的,那free函数的行为是未定义的。
            • 如果参数ptr是NULL指针,则函数什么事都不做。
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]