美文网首页
C/C++函数指针+动态内存分配

C/C++函数指针+动态内存分配

作者: LogyKoala | 来源:发表于2019-09-20 13:55 被阅读0次
  1. 函数指针
    //定义一个函数
    void message(){
    }
    
    //通过指针调用函数
    void  (*p) () =message;
    p();
    
    //带返回值和参数列表的函数指针
    double  add(double a, double b){
        return a+b;
    }
    
    //通过指针调用函数
    double (*p1) (double a, double b) =add; 
    p1(2,3)
    
    函数指针不仅仅只是一个地址,必须明确的指定函数的指针类型,以及返回值和参数列表
  2. 动态分配内存
    • c语言中内存分配(逻辑分区)
      1. 栈区:自动分配自动释放(存放的内容:主要存放的是函数的参数值和局部变量),更高效。
        栈先进后出,队列后进后出

        //40MB int四字节
        //报错:Stackoverflow栈内存溢出,
        //栈区内存的大小:操作系统和C库的版本相关(大小是有限制的)
        //数组的数据默认保存在栈内存中
        int a[1024 * 1024 * 10];
        
      2. 堆区(malloc()开辟一块新的内存空间):需要自己回收释放内存

        void heapMethod(){
            //在堆区开辟一个10M的内存空间
            int *p =(int*)malloc(1024*1024*10);
        }
        
      3. 全局区和静态区:全局变量和静态变量(也是系统自动管理,当我们的应用程序结束的时候释放)

      4. 程序代码区:存放程序代码

      5. 字符常量区:存放常量字符串,应用程序结束系统自动释放

    • malloc
      动态分配内存,返回void,在c++中void方法指针可以指向任何类型的方法指针,类似java 中的Object类型
    • 动态指定数组的大小
      //开辟一块内存,可以存储五个数字
      int* p =(int *)malloc(5* sizeof(int));
      int i=0;
      for(;i<5;i++){
          p[i] =100;
      }
      
    • 重新分配内存(realloc重新分配内存/calloc分配内存)
      realloc更改已经配置的内存空间
      1. 缩小:会导致一部分数据的丢失
      2. 扩大:(连续不断线性排序)
        1. 情况1:如果当前内存区域还没有使用完成,就会直接追加(原来开辟五条内存,使用两条,增加三条,会填补之前空闲的内存)(注意:返回原指针)
        2. 情况2:如果当前内存空闲的空间不够,那么就会从新在堆内存中寻找能够容纳该数据大小的内存区域,将原来的数据拷贝,然后在添加新的数据(原来开辟五条内存,使用两条,增加六条,重新开辟内存)(注意:返回值为新的内存地址,原来的指针被释放)
        3. 情况3: 如果所有内存已经分配完,申请内存失败,将返回NULL,而且原来的指针有效。
      //开辟一块内存区域,可以存储五个数字
      //第一个参数:数组长度
      //第二个参数:每个元素大小
      int* p =(int*)calloc(5,sizeof(int));
      int i=0
      for(;i<5;i++){
          p[i] =10;
      }
      //改变原始内存区域的大小,增加或者是减小
      //重新输出数组的数据
      int* p1 =(int*) realloc(p,(5+6)*sizeof(int));
      i=0
      for(;i<6;i++){
        p1[i] =10;
      }
      
    • 回收内存-堆区(free)
      void heapMethod(){
          //在堆区开辟一个10M的内存空间
          int *p =(int*)malloc(1024*1024*10);
          //回收内存
          free(p);
      }
      
    • 内存分配注意事项
      1. 不能多次释放内存

相关文章

  • C++中New关键字和命名空间

    动态内存分配 C++中的动态内存分配C++中通过new关键字进行动态内存申请C++中的动态内存申请是基于类型进行的...

  • C/C++函数指针+动态内存分配

    函数指针//定义一个函数void message(){}//通过指针调用函数void (*p) () =mess...

  • C++中的新成员

    C++中的动态内存分配 C++中通过new关键字进行动态内存申请 C++中的动态内存申请是基于类型进行的 dele...

  • 十、动态内存分配与命名空间

    1、C++中的动态内存分配 通过new关键字进行动态内存申请 C++中的动态内存申请时基于类型进行的 delete...

  • C++———动态内存分配

    动态内存分配用于提高内存的利用率,在c语言中使用malloc内置函数动态分配内存,而在c++中使用new运算符进行...

  • C++函数指针和Swift的函数对象

    C++函数指针和Swift的函数对象 在C++中学习函数指针式非常痛苦的事情,而在Swift里面学习函数指针则是非...

  • 动态内存分配

    《c和指针》阅读笔记 前言:为什么要使用动态内存分配?函数的局部变量会进行回收,相比于函数的局部变量,有什么好处呢...

  • 0基础学习C语言第七章:指针(1)

    C指针 学习 C 语言的指针既简单又有趣。通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配...

  • C 指针

    原文地址:C 指针 通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的...

  • malloc和new的区别是什么?

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存...

网友评论

      本文标题:C/C++函数指针+动态内存分配

      本文链接:https://www.haomeiwen.com/subject/bsdryctx.html