发布日期:2015-12-30 17:21 来源: 标签: 编程语言 C教程 C语言malloc和calloc C语言realloc
本章我们主要学习C语言动态内存分配函数malloc,calloc,以及realloc的用法,下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。
一、malloc
对于malloc,在终端输入 #:man  malloc可以知道函数原型是:
Void *calloc(size_t  size) ,包含在库函数 stdlib.h中,作用是在内存的堆区分配一个大小为size的连续空间,如果分配内存成功,函数返回新分配内存的首地址,否则,返回NULL,注意:鉴于上述这点,一般在写程序需要判断分配内存是否成功,如下程序语句:
  int  *p;
  p=(int *)malloc(sizeof(int));
  if(p!=NULL)
  .................................//需要执行的语句
  else
  .........................//打印分配内存不成功出错信息
通常造成内存分配失败的原因如下:
1、 内存访问越界
2、 所需连续的内存空间不足
二、calloc
对于函数calloc用法大致与malloc相同,函数原型为:
void *callo(size_t  num,size_t  size),作用是在内存中分配连续大小为num*size的空间,这一点在动态数组内存分配有所体现,返回值以及判断返回是否成功与上面相同,下面重点来讨论malloc与calloc区别:
1、后者在返回指向内存的指针之前把它初始化为0。
2、请求内存数量的方式不同。malloc的参数仅仅是需要分配的内存字节数;calloc的参数包括元素的数量和每个元素的字节数。
为了说明第一点,请看如下程序:

程序在第6行动态为指针p动态分配了内存, 经过gcc编译,运行结果如下:

由图可以看出红色标记部分,并没有初始化为零,也就是说在这个单元存在随机数,这样程序在运行时可能会出错。将上面的程序用calloc来调用,程序如下:

见上述程序第6行,用calloc来代替malloc分配内存单元,运行结果如下:

可以看出在用calloc申请内存时将内存都初始化为0了。那么有没有用办法用malloc同时又将内存初始化为0呢?答案是有的,用menset可以实现这一功能将第一个程序做相应改动,程序如下:

在第七行添加了语句menset(p,0,100),这条语句的意思是在内存单元p所指向的100个内存单元都赋值为0,相当与初始化内存。此时在运行此程序将不会再出现形如上述红色标记部分的结果。
三、realloc
对于realloc(),函数原型是*void realloc(void  *ptr,size_t  size),改变ptr所指内存区域的大小为size长度,如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。有一点需要注意:当分配内存成功之后,应将原本的指针ptr=NULL,否则会形成野指针,可能造成系统崩溃。
提示:不论是以上那种方式申请内存,在申请内存之后,最终都要用free释放空间,不然会造成内存泄漏。

相关评论

专题信息
    C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。 C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。