动态内存分配

来源:互联网 发布:网络布线 编辑:程序博客网 时间:2024/06/05 16:49

数组的元素存储于内存中连续的位置上。当一个数组被声明时,它所需要的内存在编译时就被分配。

void malloc( size_t size);

void free(void *pointer);

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

malloc所分配的是一块连续的内存,同时,malloc实际分配的内存可能比你请求的稍微多一点。

free的参数必须要么是NULL,要么是一个先前从malloc、calloc或realloc返回的值,向free传递一个NULL参数不会产生任何效果。

malloc有事如何知道你所请求的内存需哟啊存储的是整数、浮点数、结构还是数组呢?它并不知情——malloc返回一个类型为void * 的指针,正是由于这个原因。标准表示一个void * 类型的指针可以转换为其他任何类型的指针。

void *calloc(size_t num_elements, size_t  element_size);

void realloc(void *ptr, size_t new_size);

calloc也是用于分配内存,malloc和calloc之间主要的区别是后者在返回指向内存的指针之前把它初始化为0.这个初始化尝尝能带来方便。

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

最后,如果realloc函数的第一个参数为NULL,那么它的行为就和malloc一模一样。

对动态内存的访问,既可以使用指针也可以使用数组的形式。

利用free函数释放内存的一部分是不允许的,动态分配的内存必须整块一起释放。但是,realloc函数可以缩小一块动态分配的内存,有效地释放它尾部的部分内存。

0 0
原创粉丝点击