Chinaunix首页 | 论坛 | 博客
  • 博客访问: 132768
  • 博文数量: 40
  • 博客积分: 2228
  • 博客等级: 大尉
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-12 11:48
文章分类

全部博文(40)

文章存档

2011年(11)

2010年(29)

我的朋友

分类: C/C++

2011-04-02 17:07:43

C语言中的calloc(), malloc(), realloc(), free()
2008-06-13 11:05

首先转贴一下有关定义:

void *calloc(size_t nobj, size_t size);
分配足够的内存给nobj个大小为size的对象组成的数组, 并返回指向所分配区域的第一个字节的指针;
若内存不够,则返回NULL. 该空间的初始化大小为0字节.

char *p = (char *) calloc(100, sizeof(char));

void *malloc(size_t size);
分配足够的内存给大小为size的对象, 并返回指向所分配区域的第一个字节的指针;
若内存不够,则返回NULL. 不对分配的空间进行初始化.
char *p = (char *) malloc(sizeof(char));

void *realloc(void *p, size_t size);
将p所指向的对象的大小改为size个字节.
如果新分配的内存比原内存大, 那么原内存的内容保持不变, 增加的空间不进行初始化.
如果新分配的内存比原内存小, 那么新内存保持原内存的内容, 增加的空间不进行初始化.
返回指向新分配空间的指针; 若内存不够,则返回NULL, 原p指向的内存区不变.
char *p = (char *) malloc(sizeof(char));
p
= (char *) realloc(p, 256);

void free(void *p);
释放p所指向的内存空间; 当p为NULL时, 不起作用.
p必先调用calloc, malloc或realloc.
free(p);

需要注意的是,malloc分配的字节是以char为单位的,也就是说要注意将其转换为合适类型所需要的。比如:

double *TSdata;

TSdata=(double *)malloc(MAX_READ_LEN*(long)sizeof(double))

这里,MAX_READ_LEN是double类型数组所需要的维数。这样表示就不会出现错误。否则分配的内存就会缺少,在程序中调试也会隐含错误!

TSdata=(double *)malloc(MAX_READ_LEN)

如果采用这个语句,再用for循环给TSdata赋值,会非常正常,而且也可以正常读出。但是当再使用内存分配语句malloc对其他变量操作后,则TSdata的一部分将消失,对比char和double,我们很清楚地知道,四分之一没了。。。。。。。。

因为Tsdata是指向地址的,所以当内存初次分配、读写时是不会出错。

因此,稳妥的做法是使用calloc函数。这两者的最明显区别是malloc会将内存地址都写成0。

最后,free是需要的。


阅读(1790) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~