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

malloc()和relloc()函数的区别与用法

阅读更多

malloc():

malloc()函数有一个参数,即要分配的内存空间的大小: void *malloc(size_t size); calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小:void *calloc(size_t numElements,size_t sizeOfElement); 。
如果调用成功,函数malloc()和函数calloc()都将返回所分配的内存空间的首地址。函数malloc()和函数calloc()的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存曾经被分配过,则其中可能遗留有各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常进行,但经过一段时间(内存空间还已经被重新分配)可能会出现问题。
函数calloc()会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那麽这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那麽这些元素通常会被初始化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零。
需要包含头文件:
#i nclude 或 #i nclude
函数声明(函数原型):
void *malloc(int size);
说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如:
int *p;
p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);
或:

int* parr;
parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;
而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。
int* p;
p = (int *) malloc (sizeof(int));
第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。
第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成:
int* p = (int *) malloc (1);
代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。比如想分配100个int类型的空间:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。

另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。

realloc()

原型:extern void *realloc(void *mem_address, unsigned int newsize);

用法:#include <stdlib.h> 有些编译器需要#include <alloc.h>

功能:改变mem_address所指内存区域的大小为newsize长度。

说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

当内存不再使用时,应使用free()函数将内存块释放。

注意:这里原始内存中的数据还是保持不变的。

举例:

// realloc.c

#include <syslib.h>

#include <alloc.h>

main()

{

char *p;

clrscr(); // clear screen

p=(char *)malloc(100);

if(p)

printf("Memory Allocated at: %x",p);

else

printf("Not Enough Memory!\n");

getchar();

p=(char *)realloc(p,256);

if(p)

printf("Memory Reallocated at: %x",p);

else

printf("Not Enough Memory!\n");

free(p);

getchar();

return 0;

}

详细说明及注意要点:

1、如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address

这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。

2、如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。

并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。

老块被放回堆上。

例如:

#include <malloc.h>

char *p,*q;

p = (char * ) malloc (10);

q=p;

p = (char * ) realloc (p,20);

…………………………

这段程序也许在编译器中没有办法通过,因为编译器可能会为我们消除一些隐患!在这里我们只是增加了一个记录原来内存地址的指针q,然后记录了原来的内存地址p,如果不幸的话,数据发生了移动,那么所记录的原来的内存地址q所指向的内存空间实际上已经放回到堆上了!这样一来,我们应该终于意识到问题的所在和可怕了吧!

3、返回情况

返回的是一个void类型的指针,调用成功。(这就再你需要的时候进行强制类型转换)

返回NULL,当需要扩展的大小(第二个参数)为0并且第一个参数不为NULL,此时原内存变成了“freed(游离)”的了。

返回NULL,当没有足够的空间可供扩展的时候,此时,原内存空间的大小维持不变。

4、特殊情况

如果mem_address为null,则realloc()和malloc()类似。分配一个newsize的内存块,返回一个指向该内存块的指针。

如果newsize大小为0,那么释放mem_address指向的内存,并返回null。

如果没有足够可用的内存用来完成重新分配(扩大原来的内存块或者分配新的内存块),则返回null.而原来的内存块保持不变。

分享到:
评论

相关推荐

    malloc函数malloc函数malloc函数

    malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数...

    malloc函数的用法

    malloc函数是动态分配内存的重要的函数,看完该文,轻松学会使用malloc函数

    Malloc和new区别

    #### 四、关键字与函数的区别 - **New** 作为 C++ 中的一个保留关键字,无需包含特定的头文件即可使用。 - **Malloc** 需要通过包含 `&lt;cstdlib&gt;` 或 `&lt;malloc.h&gt;` 头文件来获得支持。 #### 五、内存分配与访问方式...

    Malloc和mfree函数的实现原理

    `malloc`和`mfree`函数在UNIX系统中的实现依赖于高效的内存管理机制,包括对内存映射(`coremap`和`swapmap`)的精细操作,以及内存分配与释放的优化策略。通过对这些函数的深入理解,程序员可以更好地控制程序的内存...

    C语言的malloc和free函数.pdf

    本文将详细解释malloc和free函数的用法和内存管理的存储机制,以便学习和使用。 首先,malloc函数是在C语言中使用最为广泛的内存分配函数之一。它在运行期间为程序分配所需大小的内存空间。其原型定义在stdlib.h...

    C语言malloc函数用法

    首先,使用`malloc`函数前,必须包含头文件`&lt;malloc.h&gt;`,这是C语言标准库提供的头文件,包含了关于动态内存分配的声明。`malloc`函数的基本语法如下: ```c void* malloc(size_t size); ``` 这里`size_t size`...

    malloc函数的c语言实现

    我写的malloc函数 用c语言实现 增加了合并内存释放内存的功能

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

    总的来说,了解和正确使用malloc和free函数是C语言编程的基础,同时理解内存管理的原理有助于编写更高效、更稳定的代码。对于特定场景下的内存管理,自定义malloc和free函数提供了一种灵活的解决方案,但需要注意其...

    自己动手写malloc函数

    本文将通过分析并实现一个简单的`malloc`函数——my_malloc,来探讨内存管理的基本概念和技巧。 内存管理是操作系统的重要组成部分,它涉及到如何为进程分配内存、释放内存以及有效地利用有限的内存资源。在用户层...

    new与malloc 的区别和用法

    1. `new`是C++运算符,支持构造函数和析构函数,而`malloc`是C库函数,不涉及对象生命周期管理。 2. `new`在语法上更安全,自动计算内存大小,`malloc`需要手动指定。 3. `new`和`delete`组合使用,`malloc`和`free`...

    malloc函数详细说明一看就懂

    malloc 函数详细说明 malloc 函数是 C 语言库函数,用于动态分配内存空间。它是 C 语言中最基本的内存管理函数之一,广泛应用于各种编程场景中。...但是,需要正确地使用 malloc 函数,以避免内存泄漏和碎片。

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

    一、malloc()和free()的基本概念与用法 1. 函数原型与说明: malloc()函数的原型为`void *malloc(long NumBytes)`,它负责为程序分配指定大小(NumBytes字节)的内存,并返回指向这块内存的指针。如果分配失败,它...

    malloc 与new的区别

    总结来说,new和delete是C++中的内存管理关键字,提供了比malloc和free更为强大的功能,如类型安全、构造函数和析构函数的调用,以及更好的异常处理机制。在C++中,建议优先使用new和delete,而不是直接使用malloc和...

    malloc函数源代码

    `malloc`函数是C语言中用于动态内存分配的关键函数,它是C标准库`stdlib.h`的一部分。`malloc`函数允许程序在运行时根据需要请求内存,这对于处理不确定大小的数据结构或者在程序执行过程中动态创建对象非常有用。让...

    malloc和calloc区别

    ### malloc和calloc的区别 在C语言中,动态内存分配是一项重要的功能,它允许程序在运行时根据需求分配或释放内存。`malloc` 和 `calloc` 是两种常用的内存分配函数,它们均定义在 `&lt;stdlib.h&gt;` 头文件中,用于动态...

    C语言malloc函数的用法

    在深入讨论`malloc()`函数的用法之前,我们先来了解一下内存管理的基本概念。 内存分为几个区域:栈区、堆区、静态数据区和常量数据区。栈区主要用于存储局部变量,它的空间有限且由编译器自动管理;堆区则是程序员...

    malloc和new的区别

    首先,malloc只是一个库函数,不具备执行构造函数和析构函数的能力,无法满足非内部数据类型的对象的需求。对象在创建时需要自动执行构造函数,在销毁之前需要自动执行析构函数,而malloc/free无法完成这项任务。...

    linux c内存分配函数介绍

    接下来,让我们来看一下kmalloc和kfree函数的用法和区别。kmalloc函数原型为#include&lt;linux/slab.h&gt;Void *kmalloc(size_t size, int flags);其中,第一个参数是要分配的块的大小,第二个参数是分配标志(flags),它...

    Malloc动态内存申请函数

    总之,malloc动态内存申请函数是C语言编程中的核心工具,理解其工作原理和使用注意事项对于编写高效、可靠的程序至关重要。通过深入研究和实践,我们可以更好地掌握内存管理技巧,提升软件的质量和性能。

Global site tag (gtag.js) - Google Analytics