动态内存分配

1. malloc和free

malloc和free,分别用于执行动态内存分配和释放。
这些函数维护一个可用内存池,当一个程序另外需要一些内存时,他就调用malloc函数,malloc从内存池中提取一块合适的内存,并向该程序返回一个指向这块内存的指针。这块内存并没有以任何方式进行初始化。如果对这块内存进行初始化非常重要,你要么自己动手进行初始化,要么使用calloc函数。

函数原型:

      #include 
       void *malloc(size_t size);
       void free(void *ptr);

malloc的参数就是需要分配的字节数,如果内存池中的可用内存可以满足这个需求,malloc就返回一个指向被分配的内存块起始位置的指针。
malloc分配的一块连续的内存。如果分配失败则函数返回NULL。

2.calloc和realloc

函数原型:

       void *calloc(size_t nmemb, size_t size);
       void *realloc(void *ptr, size_t size);

calloc也用于内存分配。
malloc和calloc之间主要区别是后者返回指向内存指针之前把它初始化为0

calloc和malloc之间另一个较小的区别是他们请求内存数量的方式不同。calloc的参数包括所需元素 的数量和每个元素的字节数。根据这些值,它能够计算出总共需要分配的内存数

realloc函数用于修改一个原先已经分配的内存块大小。使用这个函数,你可以使一块内存扩大或缩小。如果它用于扩大一个内存块,那么这块内存原先的内容依然保留,新增加的内存添加到原先内存块的后面,新内存并未以任何方式进行初始化。如果它用于缩小一个内存块,该内存块尾部的部分便被拿掉,剩余部分内存的原先内存依然保留。如果原先的内存块无法改变大小,realloc将分配一块正确大小的内存,并把原先内存的内存复制到新块上,因此,在使用realloc之后,你就不能再使用指向旧内存的指针,而是应该改用realloc所返回的新指针。如果realloc函数的第一个参数是NULL,那么它等同于malloc

你可能感兴趣的:(动态内存分配)