转载:C语言内存分配:malloc、calloc、realloc
来源:互联网 发布:c语言三种基本结构 编辑:程序博客网 时间:2024/05/10 05:50
大家都知道程序在内存中的布局分为:栈区、堆、静态变量区、常量区等几个部分。其中堆上的空间分配是由程序员自己来管理的,包括空间的申请和释放。
我们这里就说一下C标准库中提供的几个在堆上操作空间的函数:
1、void* malloc(unsigned size);
2、void* calloc(size_t nelem, size_t elsize);
3、void* realloc(void* ptr, unsigned newsize);
对于malloc(unsigned size)来讲:
它是告诉操作系统要为它分配长度为size的空间。
若分配成功,那么返回指向该块内存的指针;若分配失败,那么返回空指针。程序当中应该对分配是否成功加以控制。
当分配成功时,分配到的这段内存是什么样子的呢?如果这段内存未曾使用过,那么这段内存被初始化为0;如果这段内存曾经使用过,那么这段内存是上一次使用后的结果。因此,此时这段内存中的内容是不确定的,程序当中应该对此加以控制,通常情况下是使用memset()函数显示的将这段内存置为0。
对于calloc(size_t nelen, size_t elsize)来讲:
通过接口不难发现,该函数是告诉操作系统做这样的事:分配nelen个块给我,每个块的大小是elsize。
与malloc()一样,若分配成功,那么返回指向该块内存的指针;若分配失败,那么返回空指针。程序当中应该对分配是否成功加以控制。
与malloc()不同的时,分配到内存都会初始化为0,这点是最大的区别。
对于relloc(void* ptr, unsigned newsize)来讲:
是告诉操作系统分配(可能并不真正分配)newsize一段内存,这段内存的内容是ptr指向的内容。因此可能出现如下两种情况:若ptr指向的内存长度小于newsize,那么重新分配长度newsize的空间,同时拷贝ptr指向的内容到新的空间,新的空间的末尾一段的内容是不确定的(与malloc一样);若ptr指向的内存长度大于newsize,那么不会重新分配空间,但是将原有的空间截断为newsize大小。
最后,无论哪种分配方式,在使用完内存之后都应该使用free()进行释放;同时应该注意指针的编程规范,在定义时或释放完以后都应该即使的置为null,从而避免野指针等问题;在实际的编程当中,更多的使用malloc()和memset()进行内存的分配;calloc()更适合分配数组对应的空间。
转自:http://blog.csdn.net/p_w_m/article/details/7426158
- 转载:C语言内存分配:malloc、calloc、realloc
- [转载]C语言动态内存分配malloc/realloc/calloc
- C语言内存分配:malloc、calloc、realloc
- C语言内存分配--malloc、calloc、realloc
- C语言三个内存分配函数比较,malloc calloc realloc
- C语言 内存分配 (malloc/realloc/calloc区别)
- C语言动态内存分配malloc/realloc/calloc
- C语言动态内存分配 malloc .calloc realloc
- C语言内存分配函数malloc、calloc和realloc
- C语言内存分配calloc,malloc,alloc,realloc的区别
- C语言:动态内存malloc,calloc,realloc
- 【C/C++】内存分配函数:malloc,calloc,realloc,_alloca
- 【C/C++】内存分配函数:malloc,calloc,realloc,_alloca
- C中标准内存分配函数realloc,malloc,calloc
- linux C 之动态内存分配malloc ,calloc,realloc,free
- C中分配内存malloc、calloc和realloc
- llinux -c 之动态内存分配函数(malloc、calloc、realloc)
- c语言3个内存分配函数的区别 malloc realloc calloc
- 关于scite文本编辑器的说明
- Java网络编程深入之TCP协议编程
- opengl 直线的线型(各种虚线)
- 大牛给的ACM进阶建议
- 2个有序数组求合并后的中位数
- 转载:C语言内存分配:malloc、calloc、realloc
- MSP430 Operating Mode
- Qt中动态链接库的使用
- Android4.0.4休眠唤醒机制分析(基于MSM8260)
- java中关于static的一个小问题
- 【2012Esri中国用户大会讲座】ArcGIS 10.1 for Server 安全机制(2)使用Token
- backbone源码分析
- wince中断之2
- jxl操作excel(合并单元格,设置背景色,字体颜色)