C语言之内存分配函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    /*************************************************************
     *  C语言之动态内存分配函数malloc,calloc,realloc,memset
     *
     *  malloc: void *malloc(size_t  size)
     *          包含在库函数stdlib.h中,作用是在内存的堆区分配一个大小为size
     *          的连续空间,如果分配内存成功,函数返回新分配内存的首地址,否则,
     *          返回NULL,一般在写程序需要判断分配内存是否成功,使用完内存后要及
     *          时释放内存。
     *  calloc:void *calloc(size_t  num,size_t  size)
     *          作用是在内存中分配连续大小为num*size的空间,这一点在动态数组内存
     *          分配有所体现,如果分配内存成功,函数返回新分配内存的首地址,否则,
     *          返回NULL。
     *      malloc与calloc区别:
     *          1、calloc在返回指向内存的指针之前把它初始化为0。
     *          2、请求内存数量的方式不同。malloc的参数仅仅是需要分配的
     *            内存字节数;calloc的参数包括元素的数量和每个元素的字节数。
     *   memset:void* memset (void*p, int c, size_t n);
     *         作用:将指针p指向的n个字节的内存全部赋值为c。可以对malloc分配的
     *         内存进行初始化
     *
     *   realloc  void* realloc (void* ptr, size_t size)
     *         改变ptr所指内存区域的大小为size长度,如果重新分配成功则返回指向
     *         被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用
     *         free()函数将内存块释放。有一点需要注意:当分配内存成功之后,应
     *         将原本的指针ptr=NULL,否则会形成野指针,可能造成系统崩溃。
     *
     * 提示:不论是以上那种方式申请内存,在申请内存之后,最终都要用free释放空间,
     *     不然会造成内存泄漏。但是内存只能释放一次,不能多次调用free函数。
     *************************************************************/

     int *pm, i;
     pm = (int*)malloc(sizeof(int)*100);
     if(NULL != pm)
     {
      printf("使用malloc分配的存储空间\n");
        for(i=0; i<100; i++)
        {
            printf("%d\t", *pm++);
           if((i+1)%10 == 0) printf("\n");
        }

            printf("\n");

           free(pm);
         pm = NULL;
     }
     int *pc;
     pc = (int *)calloc(100, sizeof(int));
     printf("使用calloc分配的存储空间\n");
     for (int i=0; i<100; i++)
     {

         if(NULL != pc)
         {
             printf("%d\t", *pc++ );
             if((i+1)%10 == 0) printf("\n");
         }

     }
     printf("\n");
     free(pc);
     pc = NULL;
     int *pms = (int *)malloc(sizeof(int)*100);
     if(NULL != pms)
     {
         memset(pms, 0, 100 );
     }
     printf("使用memset分配的存储空间\n");
     for (int i=0; i<100; i++)
          {
              if(NULL != pms)
              {
                  printf("%d\t", *pms++ );
                  if((i+1)%10 == 0) printf("\n");
              }

          }
     printf("\n");
     free(pms);
     pms = NULL;
     printf("使用realloc分配的存储空间\n");
     int *pre = (int *)malloc(sizeof(int) * 50);
     if (NULL != pre)
     {
         pre = (int *)realloc(pre,sizeof(int)*100);
         if (NULL != pre)
         {
             for (i=0; i<100; i++)
             {
                 printf("%d\t", *pre++);
                 if((i+1)%10 == 0) printf("\n");
             }
         }
     }
     printf("\n");
     free(pre);
     pre = NULL;

     return 0;
}
使用malloc分配的存储空间
4138720    4133928    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    3027544    8    1465662020    1870093388    
1886612338    1550148449    1869440356    1650803804    710698869    -2147450880    -2147450880    -2147450880    1543503964    11955    
4138720    4133952    -2147450880    -2147450880    -2147450880    -2147450880    -2147450880    -2147450880    -2147450880    -2147450880    

使用calloc分配的存储空间
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    

使用memset分配的存储空间
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    

使用realloc分配的存储空间
4133528    4133824    4133880    538976288    402653208    11933    4132712    4128964    538976288    538976288    
538976288    538976288    538976288    538976288    538976288    538976288    538976288    538976288    538976288    538976288    
538976288    538976288    538976288    538976288    538976288    538976288    538976288    538976288    538976288    538976288    
538976288    538976288    538976288    -14671840    1684957440    1601402735    134217736    11964    4139504    4128964    
1113340483    1765954646    1700027502    1551070323    1953721961    1886153825    1634427745    1666999655    1869375859    1818846823    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。