`
kmplayer
  • 浏览: 508710 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于malloc函数后free内存空间的疑问

阅读更多
问题:
malloc是开出内存空间。
现在我写了这么一句:
char *name;
name=(char *)malloc(len*sizeof(char));
name指针是个char指针,指向一个char数据,即只保留了一个char数据的长度信息.free的时候它如何知道开出的空间到底有多长?

解答:
(1)malloc是一个库函数,不是由操作系统提供的,绝大部分都是由编译器提供的库包自己实现的。malloc如何实现,依赖于不同的操作系统跟不同的c库。
比如,在linux上面,malloc是调用brk系统调用进行内存分配的,而在windows则是HeapAlloc等等类似的系统函数分配内存。
一般c库在初始化的时候都是一下子在堆中分配了一大部分内存,然后再根据自己的算法对这些内存进行分配。至于free怎么知道要free多少字节。其实很简单,因为每用malloc分配一个内存块,c库就要记住你分配的多少字节,一般情况下都是记在返回指针的前几个字节。

(2)c库记忆就是开辟额外的空间记录分配内存的大小,开辟额外的空间去记录分配内存的大小也只是一个权宜之计,也只是c库玩的一种把戏而已。微软的c库这么做,gcc的c库这么做,但不代表其他所有编译器的c库都这么做。所以,通俗的讲,或者更一般的讲,用c库记忆更具有一般性。

(3)比如char * buf1 = (char*)malloc (32); 
那么buf1[-8]~ buf1[-1] 都是用来放管理信息的!特别是在windows下编程是如此. 

buf1的管理结构(8bytes)  |  buf1真正可操作空间(32bytes)   |    下一个空闲堆的管理结构(8bytes)|两个双链表指针(8bytes)
                          
     ↑                  ↑
Free()根据这里提供的      buf1真正指向这里
管理信息来回收内存
分享到:
评论

相关推荐

    自己动手写malloc函数

    在用户层,我们通常通过`malloc`、`calloc`、`realloc`和`free`等函数来操作内存。`malloc`是其中最基础的一个,它接收一个整数参数,表示需要分配的字节数,并返回一个指向新分配内存的指针。如果分配失败,`malloc...

    malloc函数详细说明一看就懂

    malloc 函数是 C 语言库函数,用于动态分配内存空间。它是 C 语言中最基本的内存管理函数之一,广泛应用于各种编程场景中。 头文件 为了使用 malloc 函数,需要包含 stdlib.h 头文件。stdlib.h 头文件提供了许多...

    C语言malloc函数用法

    C语言中的`malloc`函数是动态内存管理的重要工具,它允许程序在运行时根据需要分配内存,而不是在编译期间预设固定的内存空间。这种方式提高了程序的灵活性,尤其是在处理不确定大小的数据结构或需要动态扩展内存的...

    C语言的malloc和free函数.pdf

    在深入理解malloc和free函数的使用和存储机制后,我们可以更好地进行C语言编程,尤其是在需要大量动态内存管理的程序中。动态内存管理是C语言编程中的一个高级技巧,正确地使用malloc和free不仅可以提高程序的效率,...

    C语言实例-实现malloc与free函数完成内存管理.pdf

    malloc函数会尝试在堆上找到一块足够大的连续空间,然后返回指向这块内存的指针。如果分配失败,它会返回NULL。在实际使用中,我们需要检查malloc返回的指针是否为NULL,以防止因分配失败而导致的程序异常。以下是一...

    malloc和free的实现

    #### 四、malloc函数详解 `malloc` 函数用于分配内存,其核心逻辑如下: 1. **初始化**:当首次调用 `malloc` 时,需要初始化 `freeblock` 指针指向堆区的起始位置。 2. **查找内存块**:遍历堆区,寻找第一个可用...

    浅谈C中的malloc和free

    malloc函数是C语言中进行动态内存分配的主要工具。它允许程序在运行时根据需要请求任意大小的内存块。malloc函数的基本语法如下: ```c void* malloc(size_t size); ``` 这里,`size`参数是所需内存块的字节数。...

    Malloc动态内存申请函数

    malloc函数是C标准库提供的一种动态内存分配的方式,允许程序在运行时根据需要申请内存空间。本文将深入探讨malloc函数的工作原理及其在实际项目中的应用。 malloc函数的基本用法是`void* malloc(size_t size)`,它...

    C语言基础之malloc和free函数详解

    malloc()在分配内存时,除了用户请求的大小外,还会额外分配一些空间来存储管理信息,如内存块的大小、相邻块的指针等。这些信息有助于free()正确地释放内存。当调用free()释放内存时,它根据管理信息找到并释放对应...

    malloc函数及用法

    malloc函数的使用形式为:(类型说明符*)malloc(size),其中“类型说明符”是指将要分配的内存空间用于存储何种数据类型,“size”是要分配的内存空间的大小,以字节为单位。函数的返回值是该内存空间的首地址。 ...

    C语言实现malloc和free

    在C语言中,`malloc`和`free`是两个非常重要的内存管理函数,它们用于动态地分配和释放内存。理解并能自己实现这两个函数对于深入理解C语言内存管理至关重要。`malloc`函数允许程序在运行时请求特定大小的内存块,而...

    C语言malloc函数的用法

    C语言中的`malloc()`函数是动态内存管理的重要工具,它允许程序在运行时根据需要分配内存。这个功能对于处理不确定大小的数据集合或者在程序执行过程中才能确定大小的数据结构非常有用。在深入讨论`malloc()`函数的...

    Malloc和mfree函数的实现原理

    #### Malloc函数详解 `malloc`函数的核心任务是在运行时为程序分配指定大小的连续内存空间。在UNIX系统中,`malloc`的实现主要依赖于源代码中的`malloc.c`文件,该文件中定义了`malloc`和`mfree`函数的逻辑。`...

    malloc 函数工作机制.docx

    malloc函数是C语言中用于动态内存分配的重要工具,其工作原理涉及到内存管理、内存碎片以及glibc的内存管理策略。理解malloc的内部机制有助于编写更高效、更节省资源的程序。 malloc函数的核心在于维护一个空闲链表...

    malloc()和free()的基本概念以及基本用法

    在 C 语言中,malloc() 和 free() 是两个非常重要的函数,它们负责动态分配和释放内存空间。下面具体介绍 malloc() 和 free() 的基本概念和用法。 malloc() 函数 malloc() 函数的原型是 `void *malloc(long ...

    malloc函数在Linux系统下的原理性实现.pdf

    malloc函数是C语言中用于内存动态分配的重要工具,它允许程序在运行时根据需要分配内存,极大提高了编程的灵活性。然而,在Linux系统下,malloc函数并不是直接可用的,这为C程序的编写和移植带来了一定的困扰。本文...

Global site tag (gtag.js) - Google Analytics