zoukankan      html  css  js  c++  java
  • 内存分配函数malloc、realloc、calloc、_alloca

    1.内存分配函数_alloca、malloc、realloc、calloc:

    _alloca

      函数原型void * __cdecl _alloca(size_t);  头文件:malloc.h

      _alloca函数返回一个指向申请到的空间的void型指针。该函数向栈(stack)申请内存,用完就立刻释放,无需手动释放。

    malloc 动态内存分配

      函数原型 extern void *malloc(unsigned int num_bytes);

      函数声明void *malloc(size_t size);  头文件stdlib.h   malloc.h

      malloc函数返回一个指向申请到的空间的void型指针,若申请失败则返回NULL。该函数向堆(heap)申请内存,不再使用该空间时,需要用free()释放。否则会造成内存泄漏。

    calloc 动态内存分配并清零

      函数原型 void *calloc(size_t n, size_t size);  头文件 stdlib.h malloc.h

      calloc 函数在内存的动态存储区中分配n个长度为size的连续空间,返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。同样需要用free()释放。

      其中清零指:若是为字符类型或整型元素分配内存,这些元素会被初始化为0;若是为指针类型元素分配内存,其通常被初始化为空指针;若为实型数据分配内存,则被初始化为浮点型的零。

     1 //calloc分配完存储空间后将元素初始化
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 int main()
     5 {
     6     int* p = (int*)calloc(10, sizeof(int));
     7     for(int i = 0; i < 10; i++)
     8         printf("%d", p[i]);
     9     printf("
    ");
    10     free(p);
    11     return 0;
    12 }

    输出为十个0

    realloc 动态内存调整(对malloc申请的内存进行大小的调整)

      函数原型extern void *realloc(void *mem_address, unsigned int newsize);   头文件:stdlib.h 有些编译器需要malloc.h

      指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。

      对于缩小:被缩小的那一部分的内容会丢失

      对于扩大:先判断当前的指针是否有足够的连续空间,如果有,直接从现存的数据后面向堆申请内存以扩大内存空间,即扩大mem_address指向的地址,并且将mem_address返回;如果空间不够,先按照newsize指定的大小分配其他空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

     1 //Eg1 realloc有足够内存空间分配 
     2 #include <stdio.h>  
     3 #include <stdlib.h>   
     4   
     5 int main()   
     6 {   
     7     char *p = (char *)malloc(10);  
     8     char *q = p;  
     9     p = (char *)realloc(p, 10);  
    10     printf("p=0x%x
    ", p);  
    11     printf("q=0x%x
    ", q);  
    12       
    13     return 0;   
    14 }  
    15 //        结果:p=0xb91398 
    16 //             q=0xb91398  
    17 //验证:有足够内存空间分配 扩大p指向的空间,并将原来p返回。      
     1 //Eg2 realloc无足够内存空间分配 
     2 #include <stdio.h>  
     3 #include <stdlib.h>  
     4   
     5 int main()   
     6 {    
     7     char *p = (char *)malloc(10);  
     8     char *q = p;  
     9     p = (char *)realloc(p,1000);  
    10     printf("p=0x%x
    ", p);  
    11     printf("q=0x%x
    ", q);  
    12     return 0;   
    13 } 
    14 //            结果:p=0x690c50
    15 //                 q=0x691398     内存地址改变
    16 //验证:无足够内存空间分配 按newsize分配空间 将数据拷贝到新内存区域 
    17 //         返回新分配的内存区域的首地址

    2.malloc、realloc、calloc异同点

    同:1.头文件stdlib.h   malloc.h 

      2.函数的返回值都是新申请内存空间的首地址,失败则返回NULL

      3.向堆(heap)申请内存,不再使用其申请空间时用free()释放

    异:

    malloc与calloc:calloc在动态分配完内存后,自动初始化该内存空间为零;而malloc不初始化,里面数据是随机的垃圾数据。

    malloc与realloc:realloc是对malloc申请的内存进行大小的调整。缩小时,被缩小的那一部分的内容会丢失。扩大时,realloc会向堆中现存的数据后申请需扩大的内存,若成功,则返回地址与原首地址相同;若内存空间不够,则选取堆中足够大小的自由块,将原有数据依次拷贝到新地址,并释放原来所使用内存区域(系统自动释放),同时返回新分配的内存区域的首地址。

  • 相关阅读:
    远程连接Oracle 服务器 解决Oracle查询中文乱码
    sql 复杂查询 以teacher student course多对多关系为例
    ZooKeeper 分布式锁实现
    zookeeper原理解析-客户端与服务器端交互
    zookeeper原理解析-服务器端处理流程
    zookeeper原理解析-选举
    zookeeper原理解析-序列化
    深入浅出 Redis client/server交互流程
    zookeeper原理解析-数据存储
    RocketMQ原理解析-Remoting
  • 原文地址:https://www.cnblogs.com/kuotian/p/5277335.html
Copyright © 2011-2022 走看看