`
mmdev
  • 浏览: 12915256 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

C语言内存分配:malloc、calloc、realloc

 
阅读更多

大家都知道程序在内存中的布局分为:栈区、堆、静态变量区、常量区等几个部分。其中堆上的空间分配是由程序员自己来管理的,包括空间的申请和释放。

我们这里就说一下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的区别

    C语言中 malloc、calloc、realloc的区别 (1)C语言跟内存分配方式 从静态存储区域分配.  内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量. 在栈上创建  在执行...

    C语言动态内存分配之malloc与realloc区别

    在程序的执行期间分配内存时,内存区域中的这个空间称为堆(heap)。还有另一个内存区域,称为栈(stack),...  C函数库中的malloc和free分别用于执行动态内存分配和释放。这两个函数的原型如下所示,他们都在头文件st

    c语言中malloc、realloc与calloc 的区别以及联系

    以下是对c语言中的malloc函数,realloc函数与calloc函数的区别以及它们之间的联系进行了介绍,需要的朋友可以过来参考下

    C语言动态内存分配函数解析

    引言:对于指针,正确的分配动态内存是十分重要的,本文将着重阐述动态内存分配函数malloc,calloc,realloc以及memset的用法。  一、对于malloc,在终端输入 #:man malloc可以知道函数原型是:  Void *calloc...

    C++动态内存分配(new/new[]和delete/delete[])详解

    当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些函数在运行时从堆中(也称自由内存)分配存储单元,但是运用这些库函数...

    C语言动态内存分配的详解

    C语言动态内存分配的详解 1.为什么使用动态内存分配 数组在使用的时候可能造成内存浪费,使用动态内存分配可以解决这个问题。 2. malloc和free C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和...

    内存分配管理的代码用C实现

    自己写的内存分配管理的代码,用C实现 主要是解决自己分配的内存忘记释放的问题,自己定义了几个函数取代了malloc,calloc,realloc,free这几个函数,尽量跟原有用法一致。 头文件mypool.h

    EDA/PLD中的C语言动态内存分配函数解析

    引言:对于指针,正确的分配动态内存是十分重要的,本文将着重阐述动态内存分配函数malloc,calloc,realloc以及memset的用法。  一、对于malloc,在终端输入 #:man malloc可以知道函数原型是:  Void *calloc...

    MemLeak内存泄漏检测工具

    MemLeak 是一个C语言内存泄漏检测工具... 原理是利用 C 语言的宏调用来替代原有的函数调用, memleak 维护了一个链表,在这个链表中保存着程序中对内存函数调用的记录,这些函数包括:malloc、calloc、realloc、free。

    浅析c语言中的内存

    2、堆(heap):malloc、realloc、calloc等开辟的内存就在堆,从低地址向高地址增长,由程序员分配和释放,系统不自动回收,所以一定要记得申请了就要释放,以免溢出。 3、数据段(初始化数据段)(data):存放初始...

    指针是C语言可以用来直接访问内存地址

    在C语言中,我们可以使用malloc、calloc和realloc等函数来动态分配内存空间。这些函数返回一个指向分配内存空间起始位置的指针,我们可以通过这个指针来访问和操作这块内存空间。同时,我们还可以使用free函数来释放...

    C语言的那些小秘密之内存分配

    C语言的那些小秘密之内存分配。realloc()函数、malloc()函数、calloc()函数以及区别。

    zmalloc-c:内存分配器

    内存分配器这是C语言中的内存分配器。它使用来避免碎片。 公共接口包括标准的malloc , calloc , realloc和free 。例子# include < stdio># include " ../src/zmalloc.h "// gcc -Wall -Wextra hello.c ../src/...

    c-language-topicwise:所有C程序按主题

    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程序:按主题进行所有C程序

    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语言中堆空间的生成与释放详解

    堆空间的分配和释放 #include  malloc、calloc、realloc、free malloc void *malloc(size_t size); 功能:在堆中分配 size 字节的连续空间 参数:size_字节数 返回值:成功返回分配空间的首地址,失败返回 ...

    C语言函数速查手册

    C语言常见的函数速查 字符串函数 bcmp bcopy bzero memccpy memchr memcmp memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup ...

    C 语言库函数使用手册

    字符串函数 bcmp bcopy bzero memccpy memchr memcmp memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp ...动态内存分配函数 calloc free malloc realloc

Global site tag (gtag.js) - Google Analytics