C 中内存分配函数

C 语言的内存分配方式


  • 从静态存储区分配:内存在程序编译期间分配;这块内存在程序这个运行期间都存在。例如:全局变量、static 变量;
  • 从栈上分配:内存在编译期间分配;例如函数内的局部变量,函数执行结束,内存自动释放;栈内容效率高,容量有限;
  • 从堆上分配(或称之为动态内存分配):在运行期间分配,需要手动申请(使用 malloc 或 new)手动释放(使用free或delete);动态内存的生存周期由用户决定;

C 语言中与内存申请相关的函数


  • alloca:向栈申请内存,系统自动释放;
  • void* malloc(unsigned size):向堆申请内存,没有堆内存进行初始化,一般用 memset 来初始化;
  • void* calloc(size_t numElements, size_t sizeOfElement):向堆申请内存,并初始化为 0;
  • void* realloc(void* ptr, unsigned newsize):对 molloc 申请的内存进行大小调整;如果是对内存进行扩大,会优先在原来内存的基础之上进行扩大;如果原来的地址空间不足,会使用堆山第一个足够大小的空间,并返回该空间的地址;

上述内存分配函数的头文件为 molloc.h

查看 mallocrealloc 分配内存的地址:

  • 返回地址相同的情况
#include <stdio.h>  
#include <malloc.h>    
int main(int argc, char* argv[])   
{   
     char *addr1, *addr2;  
     addr1 = (char *)malloc(10);    
     addr2 = (char *)realloc(addr1,11);  
     printf("addr1 = 0x%x/n",addr1);  
     printf("addr2 = 0x%x/n",addr2);        
    return 0;   
}   

结果:地址不变:

addr1 = 0x431a70  
addr2 = 0x431a70  
  • 返回地址不相同的情况
#include <stdio.h>  
#include <malloc.h>    
int main(int argc, char* argv[])   
{   
     char *addr1, *addr2;  
     addr1 = (char *)malloc(10);    
     addr2 = (char *)realloc(addr1,1000);  
     printf("addr1 = 0x%x/n",addr1);  
     printf("addr2 = 0x%x/n",addr2);        
    return 0;   
}   

结果:地址不同

addr1 = 0x351c0  
addr2 = 0x431a70  

版权声明:本文为zhi_neng_zhi_fu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。