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

       }

      

 

 

 

posted @ 2020-05-18 22:12  岁月荏苒¥我心依旧  阅读(114)  评论(0编辑  收藏  举报