大家都知道程序在内存中的布局分为:栈区、堆、静态变量区、常量区等几个部分。其中堆上的空间分配是由程序员自己来管理的,包括空间的申请和释放。
我们这里就说一下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()更适合分配数组对应的空间。
分享到:
相关推荐
C语言中 malloc、calloc、realloc的区别 (1)C语言跟内存分配方式 从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量. 在栈上创建 在执行...
在程序的执行期间分配内存时,内存区域中的这个空间称为堆(heap)。还有另一个内存区域,称为栈(stack),... C函数库中的malloc和free分别用于执行动态内存分配和释放。这两个函数的原型如下所示,他们都在头文件st
以下是对c语言中的malloc函数,realloc函数与calloc函数的区别以及它们之间的联系进行了介绍,需要的朋友可以过来参考下
引言:对于指针,正确的分配动态内存是十分重要的,本文将着重阐述动态内存分配函数malloc,calloc,realloc以及memset的用法。 一、对于malloc,在终端输入 #:man malloc可以知道函数原型是: Void *calloc...
当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些函数在运行时从堆中(也称自由内存)分配存储单元,但是运用这些库函数...
C语言动态内存分配的详解 1.为什么使用动态内存分配 数组在使用的时候可能造成内存浪费,使用动态内存分配可以解决这个问题。 2. malloc和free C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和...
自己写的内存分配管理的代码,用C实现 主要是解决自己分配的内存忘记释放的问题,自己定义了几个函数取代了malloc,calloc,realloc,free这几个函数,尽量跟原有用法一致。 头文件mypool.h
引言:对于指针,正确的分配动态内存是十分重要的,本文将着重阐述动态内存分配函数malloc,calloc,realloc以及memset的用法。 一、对于malloc,在终端输入 #:man malloc可以知道函数原型是: Void *calloc...
MemLeak 是一个C语言内存泄漏检测工具... 原理是利用 C 语言的宏调用来替代原有的函数调用, memleak 维护了一个链表,在这个链表中保存着程序中对内存函数调用的记录,这些函数包括:malloc、calloc、realloc、free。
2、堆(heap):malloc、realloc、calloc等开辟的内存就在堆,从低地址向高地址增长,由程序员分配和释放,系统不自动回收,所以一定要记得申请了就要释放,以免溢出。 3、数据段(初始化数据段)(data):存放初始...
在C语言中,我们可以使用malloc、calloc和realloc等函数来动态分配内存空间。这些函数返回一个指向分配内存空间起始位置的指针,我们可以通过这个指针来访问和操作这块内存空间。同时,我们还可以使用free函数来释放...
C语言的那些小秘密之内存分配。realloc()函数、malloc()函数、calloc()函数以及区别。
内存分配器这是C语言中的内存分配器。它使用来避免碎片。 公共接口包括标准的malloc , calloc , realloc和free 。例子# include < stdio># include " ../src/zmalloc.h "// gcc -Wall -Wextra hello.c ../src/...
C语言程序的主题:1.变量2.数据类型3.if-else 4.for循环5....静态内存分配12.calloc,malloc,realloc,free 13.指针14.递归15.函数16.array 17.结构18.结构19.union 20.按值调用21.按引用调用22.enum / *更多内容* /
C语言程序的主题:1.变量2.数据类型3.if-else 4.for循环5....静态内存分配12.calloc,malloc,realloc,free 13.指针14.递归15.函数16.array 17.结构18.结构19.union 20.按值调用21.按引用调用22.enum / *更多内容* /
堆空间的分配和释放 #include malloc、calloc、realloc、free malloc void *malloc(size_t size); 功能:在堆中分配 size 字节的连续空间 参数:size_字节数 返回值:成功返回分配空间的首地址,失败返回 ...
C语言常见的函数速查 字符串函数 bcmp bcopy bzero memccpy memchr memcmp memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup ...
字符串函数 bcmp bcopy bzero memccpy memchr memcmp memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp ...动态内存分配函数 calloc free malloc realloc