zoukankan      html  css  js  c++  java
  • 07_动态分配内存

    一、内存的使用

        堆(heap)

           在程序执行期间分配内存时,内存区域中的这个空间称为堆(heap)。,malloc,calloc

        栈(stack)

           一般是函数分配给本地的参数和本地变量(局部变量)。

    二、动态内存分配malloc函数

        在C语言中最简单的内存分配函数是malloc函数,原型如下: 

        void *malloc( size_t size );

        // 字节(BYTE) char 成功将返回分配内存空间的地址值,失败将返回NULL也就是0;

           例:

        int *pNum=(int*) malloc(100); //分配100字节,也就是25int类型的空间

    三、分配内存时使用sizeof运算符

     :

     int *pNum=(int*) malloc(25*sizeof(int)); //分配字节,也就是个int类型的空间 

     double *pfNum=(double *) malloc(25*sizeof(double ));

     

    四、用指针访问内存

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int *pNum=(int*) malloc(25*sizeof(int));
    
        int i,*p;
    
        p=pNum;
    
        for (i=0;i<25;i++)
    
        {
    
            *pNum++=i;
    
        }
    
        pNum=p;
    
        for (i=0;i<25;i++)
    
        {
    
            printf("%d,", *pNum++); //pNum=pNum+25;
    
        }
        free(*pNum);
        getchar();
    
    
    
        return 0;
    
    }
    View Code
    0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
    View Code

    五、以数组的形式访问内存

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int *pNum=(int*) malloc(24*sizeof(int)); //3*8,4*6,6*4,2,12
        int i;
        for (i=0;i<25;i++)
        {
            pNum[i]=i;
        }
        for (i=0;i<25;i++)
        {
            printf("%d,", pNum[i]); //pNum=pNum+25;
        }
        getchar();
        return 0;
    
    }
    View Code
    0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
    View Code
    1int (*pNum)[3]=(int (*)[3]) malloc(24*sizeof(int)); 
     以 pNum[8][3]形式访问内存空间.
    
    
       //8*3 [8][3]
        int (*pNum)[3];
        int i,j,n;
        n=1;
        pNum=(int (*)[3])malloc(24*sizeof(int));
        for (i=0;i<8;i++)
            for (j=0;j<3;j++)
            {
                pNum[i][j]=n++;
            }
          
    //读取多维数组的值
            for (i=0;i<8;i++)
            for (j=0;j<3;j++)
            {
                printf("%d,",pNum[i][j]);
            }
        //三维数组
       //8*3 [8][3]
       //10*3*4
        int (*pNum)[3][4];
        int i,j,k,n;
        n=1;
        pNum=(int (*)[3][4])malloc(122*sizeof(int));
        for (i=0;i<10;i++)
            for (j=0;j<3;j++)
                for(k=0;k<4;k++) 
            {
                pNum[i][j][k]=n++;
            }
    //      
    ////读取多维数组的值
        for (i=0;i<10;i++)
            for (j=0;j<3;j++)
                for(k=0;k<4;k++) 
            {
                printf("%d,",pNum[i][j][k]);
            }
    View Code

    六、calloc函数分配内存

      void *calloc( size_t num, size_t size );

      int *p=(int*) malloc(25*sizeof(int));

      int *p=(int*)calloc(25,sizeof(int);

    七、 calloc与malloc的区别

    1、参数不同

    2、多了初始化内存的功能 0

    八、memset函数

    void *memset( void *dest, char c, size_t count );

    九、  释放动态分配的内存

     为什么要释放内存?

      1、当动态分配了一些内存时,没有保留对它们的引用,就会出现内存泄漏,些时无法释放内存。这常常发生在循环内部,由于没有释放不再需要的内存,程序会使用越来越多的内存,最终将会占用所有内存。

    void free( void *memblock );

    //测试

           int *p;

           while (1)

           {

                  p=malloc(10000);

                  //其它代码段

                  //free(p);

           }

          

  • 相关阅读:
    flume sink两种类型 file_rool 自定义sing com.mycomm.MySink even if there is only one event, the event has to be sent in an array
    为什么引入进程20年后,又引入线程?
    As of Flume 1.4.0, Avro is the default RPC protocol.
    Google Protocol Buffer 的使用和原理
    Log4j 2
    统一日志 统一订单
    网站行为跟踪 Website Activity Tracking Log Aggregation 日志聚合 In comparison to log-centric systems like Scribe or Flume
    Percolator
    友盟吴磊:移动大数据平台的架构、实践与数据增值
    Twitter的RPC框架Finagle简介
  • 原文地址:https://www.cnblogs.com/sd-xyy/p/12907553.html
Copyright © 2011-2022 走看看