动态分配内存 malloc、calloc、realloc

来源:互联网 发布:linux下导入数据库 编辑:程序博客网 时间:2024/05/20 09:07

.当数组被声明时,必须在编译时知道它的长度。动态内存分配允许程序为一个长度在运行时才知道的数组分配内存空间。


malloc从内存池中提取一块合适的内存。并向该程序返回一个指向这块内存的指针。这块内存此时并没有以任何方式进行初始化。如果要对其进行初始化,要么自己动手进行初始化,要么使用calloc()函数

void *malloc(size_t  size);

如果操作系统无法向malloc提供更多的内存,malloc就返回一个NULL指针。因此,要对每个从malloc返回的指针都进行检查,确保它并非NULL是非常重要的。

pi  =  malloc(25 *sizeof(int)); 不要直接malloc(100)

使用该方法,即使在整数长度不同的机器上,它也能获得正确的结果,移植性好


void   *calloc(size_t num_elements,size_t element_size);

void   realloc(void  *ptr,size_t  new_size); //size为新的总的内存大小,并非增加的大小

malloc和calloc之间的区别是后者在返回指向内存的指针之前把它初始化为0。但如果程序只是想把一些值存储到数组中,那么这个初始化过程纯属浪费时间。

realloc函数用于修改一个原先已经分配的内存块大小。使用这个函数,你可以使一块内存扩大或缩小。如果它用于扩大一个内存块,那么这块内存原先的内容依然保留,新增加的内存添加到原先内存块的后面,新内存并未以任何方法进行初始化

如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的块上。因此,在使用realloc之后,就不能再使用指向旧内存的指针,而是应该该用realloc所返回的新指针。

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


说明:

 动态分配最常见的错误就是忘记检查所请求的内存是否成功分配。

² 2.动态内存分配的第二大错误来源是操作内存时超出了分配内存的边界

2.当你使用free时,可能出现各种不同的错误。

1>传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。

2>传递给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即终止或在晚些时候终止。

3>试图释放一块动态分配内存的一部分也有可能引起类似问题。


原创粉丝点击