`
tansitongba
  • 浏览: 503586 次
文章分类
社区版块
存档分类
最新评论

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语言编程书:C语言从入门到精通](atcpu.com).pdf

    9. **内存管理**:动态内存分配(malloc、calloc、realloc、free)的理解和实践。 10. **错误处理**:学会使用errno和perror来处理程序运行时的错误。 11. **标准库函数**:如字符串操作(strcpy、strcat、strcmp...

    C语言内存管理:静态与动态分配的较量

    这种方式通过标准库函数`malloc`、`calloc`、`realloc`和`free`来实现。 - **运行时分配**:内存在程序运行时根据需要动态分配。 - **作用域不受限**:动态分配的内存可以跨函数使用,直到被显式释放。 - **存储...

    C语言中 malloc,calloc,realloc的区别

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

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

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

    C语言内存分配.pdf

    在C语言中,动态内存分配是通过一系列标准库函数实现的,如malloc()、calloc()、realloc()和free()。而C++中则使用了new和delete运算符来实现同样的目的。动态内存的管理对于资源的灵活使用和有效利用至关重要。 C/...

    c语言中动态内存分配问题

    C语言提供了四个与动态内存分配相关的函数:`calloc()`、`malloc()`、`realloc()` 和 `free()`。这些函数都在 `<stdlib.h>` 头文件中定义。 1. `calloc()` 函数用于分配指定数量的元素,每个元素的大小为指定的字节...

    C语言内存分配详解

    堆是通过动态分配函数(如`malloc`、`calloc`、`realloc`)来获取和释放的内存区域。程序员负责管理这部分内存,使用`malloc`分配的内存必须用`free`函数来释放。如果忘记释放,会导致内存泄漏,即已分配的内存无法...

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

    在C语言中,内存管理是程序员需要关注的重要部分,其中malloc、realloc和calloc是三个常用的动态内存分配函数。它们各自有不同的特点和用途,下面将详细介绍它们的区别和联系。 1. **malloc**: - malloc函数用于...

    C语言内存分配代码.zip

    本压缩包"13allocMem"可能包含一系列示例代码,用于演示C语言中的内存分配技术。下面我们将详细探讨C语言中的内存分配。 内存分为几个区域: 1. **栈区(Stack)**:由编译器自动分配和释放,用于存放函数参数、...

    操作系统 内存分配与回收 C语言模拟(含源代码和.exe文件)

    它提供了直接访问内存的机制,如`malloc`、`calloc`、`realloc`和`free`等函数,这些函数在C语言中用于动态内存分配和释放。 内存分配主要包括两种类型:静态内存分配和动态内存分配。静态内存分配在编译时完成,...

    C语言内存精讲.rar

    堆则是动态分配内存的地方,程序员可以通过malloc、calloc、realloc和free等函数进行手动管理,灵活性高但效率相对较低。静态存储区用于存储全局变量和静态变量,这些变量在整个程序生命周期内都存在。 1. **栈内存...

    C语言基础知识:指针和内存管理.docx

    在C语言中,内存分配有两种主要方式:静态分配(例如局部变量)和动态分配(例如使用`malloc()`、`calloc()`、`realloc()`和`free()`函数)。 - 静态分配的内存由编译器在编译期间分配,自动管理生命周期,而动态...

    C语言课程设计:人事管理系统.zip

    要掌握`malloc()`, `calloc()`, `realloc()`, 和 `free()`等函数,确保内存的有效管理和释放。 5. 函数设计与模块化:为了使代码易于维护和扩展,应将不同功能(如添加员工、查询员工、修改员工信息等)封装为独立...

    C语言指针详解:基本概念、用法、示例与高级特性

    内容概要:本文深入介绍了C语言中指针的相关知识点,涵盖了指针的基本概念、声明、用法、示例、算术操作、类型(如野指针、空指针、函数指针)、指针与数组的关系、动态内存分配方法(如malloc、calloc、realloc、...

    C语言内存管理

    C语言中常用的内存分配函数有malloc、calloc、realloc,它们的原型都定义在stdlib.h头文件中。其中,malloc用于分配一块指定大小的内存区域,calloc分配内存时会将内存区域初始化为零,realloc用于调整之前分配的...

    c语言内存管理.pdf

    本文档将深入探讨C语言中的内存管理机制,帮助开发者理解不同类型的内存分配以及如何有效管理它们。 #### 二、内存区域划分 1. **代码段(Code Segment)**: - 存储程序的机器码指令。 - 不可修改,只读属性。 ...

    c语言内存分配[借鉴].pdf

    - **堆区**:动态内存分配区域,通过`malloc()`、`calloc()`、`realloc()`和`free()`等函数进行管理。程序员负责手动释放未使用的内存,否则可能导致内存泄漏。 3. **变量的作用域**: - **局部变量**:在函数...

    c语言内存论文数篇(CNKI)

    - **堆区**:程序员通过malloc、calloc、realloc、free等函数进行动态内存分配和释放。堆空间较大,但管理复杂,容易产生内存泄漏。 - **静态区**:存放全局变量和静态变量,程序运行期间一直存在,直到程序结束。...

Global site tag (gtag.js) - Google Analytics