• 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);

           }

          

  • 相关阅读:
    OCP-1Z0-053-V12.02-367题
    OCP-1Z0-053-V12.02-16题
    OCP-1Z0-053-V12.02-21题
    OCP-1Z0-053-V12.02-368题
    OCP-1Z0-053-V12.02-356题
    VC++ 线程池(h)
    OCP-1Z0-053-V12.02-361题
    OCP-1Z0-053-V12.02-355题
    OCP-1Z0-053-V12.02-289题
    OCP-1Z0-053-V12.02-100题
  • 原文地址:https://www.cnblogs.com/sd-xyy/p/12907553.html
Copyright © 2020-2023  润新知