分配内存malloc和free()

所有的程序都必须留出足够的内存来存储它们使用的数据。一些内存分配是自动完成的。在运行时需要分配更多的内存。主要的工具是函数malloc(),它接受一个参数:所需要内存字节数。然后malloc找到可用内存中一个大小合适的块。内存是匿名的;也就是说,malloc()分配了内存,但没有为它指定名字。然而,它却可以返回那块内存第一个字节的地址。因此,可以把那个地址赋值给一个指针变量,并使用该指针来访问那块内存。

char place[] = "Dancing Oxen Creek";

因为char代表一个字节,所以传统上曾将malloc定义为指向char的指针类型。

在ANSI C标准使用中使用了一个新的类型:指向void的指针。这一类型被用作“通用指针”。函数malloc()可用来返回数组指针、结构指针等等,因此一般需要把返回值的类型指派为适当的类型。在ANSI C中,为了程序清晰应对指针进行类型指派,但将void指针值赋值给其他类型的指针并不构成类型冲突。如果malloc()找不到所需要的空间,他将返回空指针。

使用malloc创建一个数组。可以在程序运行时使用malloc()请求一个存储块,另外还需要一个指针来存放该块在内存中的位置。

double * ptd;
ptd = (double *) malloc (30 * sizeof(double));

请求30个double类型值的空间,并且包ptd指向空间所在的位置。

这里的ptd 是作为指向一个double类型值的指针声明,而不是指向30个类型值的数据块的指针。这里的数组的名字是它的第一个元素的地址。

如果令ptd指向一个内存的第一个元素,就可以像使用数组名字一样的使用它了。

也就是说,可以使用表达式ptd[0]来访问一个内存块的第一个元素,ptd[1]访问第二个元素依次类推。可以在指针符号中使用数组名,也可以在数组符号中使用指针。

创建一个数组有3种方式

1、声明一个数组,声明时用常量表达式指定数组维数,然后可以用数组名访问数组元素

2、声明一个变长的数组,声明时用变量表达式指定数组维数,然后用数组名来访问数组元素

3、声明一个指针,调用malloc(),然后使用该指针来访问数组元素。

一般的,对应每个malloc调用,应该调用一个free()。函数free的参数是先前malloc()返回的地址,他释放先前分配的内存。这样所分配的内村的持续时间从调用malloc()分配内存开始,到调用free()释放内存以供再使用为止。设想malloc()free()管理着一个内存池。每次调用malloc()分配内存给程序使用,每次调用free()将内存归还到池中,使内存再次被使用。free()参数应是一个指针,指向有malloc()分配的内存块;不能使用free()来释放通过其他方式分配内存。在头文件stdlib.h中有malloc()和free()的原型。

通过使用malloc(),程序可以在运行时决定需要多大的数组并创建他。

时间: 2024-12-21 03:26:49

分配内存malloc和free()的相关文章

分配内存malloc()和free()

1.首先回顾一下内存分配的有关事实.所有的程序都必须留出足够内存来存储他们使用的数据.一些内存分配是自动完成的.如: float x; char place[]="dancing oxen creek". 于是系统将留出存储float或者字符串足够的内存空间,也可明确要求确切的内存,int a[100];这一声明留出100个内存位置.每个位置可存储一个int值.c的功能远非如此.可以在程序运行时分配更多的内存.主要工具函数就是malloc(),参数:所需字节数.然后malloc()找到

在dll里malloc/new/cvCreate分配内存,在exe里free/Releases释放内存时会出错。

写了个程序,在DLL中用malloc分配了一块内存,但是在exe程序中释放,结果程序crash,原因就是:其原因可能是堆被损坏,这也说明 TestMySticker.exe 中或它所加载的任何 DLL 中有 bug. 以下文字引用自 http://hi.baidu.com/huhe/blog/item/0b422edd1f1563d98c1029a3.html 一个模块一个堆,一个线程一个栈. dll里malloc的内存,在exe里free会出错. CRT(C运行时期库)不是使用进程缺省的堆来实

C++ 内存、new与malloc分配内存区别?

一关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2)在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3) 从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或de

内存分配机制malloc&&alloca&&realloc

<1>从静态存储区域分配.       内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2>在栈上创建       在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. <3>从堆上分配,亦称动态内存分配.       程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用fr

内存分配(malloc,new,VirtualAlloc,HeapAlloc,GlobalAlloc,LocalAlloc)区别与注意

malloc()头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的.)功能:分配长度为num_bytes字节的内存块说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL.当内存不再使用时,应使用free()函数将内存块释放. C运行库中的动态内存分配函数,主要用于ANSI C(C语言的标准)程序中,是标准库函数.WINDOWS程序基本不再使用这种方法进行内存操作,

第十二章 分配内存: malloc ()与free () 及calloc()

 malloc () : 它接受一个参数,即所需内存字节数.如果成功,则返回该空间首地址,该空间没有初始化,如果失败,则返回NULL ,(但是找到的内存是匿名的) (分配类型 *)malloc(分配元素个数 *sizeof(分配类型)) 例子: double * ptb; ptb = (double * ) malloc (30 * sizeof (double )); 这段代码请求30个 double类型值的空间,并且把ptb指向该空间所在位置,注意ptb是作为一指向一个double类型值

c malloc分配内存

php中的内存分配有用类似emalloc这样的函数,emalloc实际上是C语言中的malloc的一层封装,php启动后,会向OS申请一块内存,可以理解为内存池,以后的php分配内存都是在这块内存池中进行的,以至于efree,也不会向OS退回内存,而只是设置标志位,标识efree这块内存不再使用了,这样做的好处是,速度快,避免系统调用,因为频繁的从用户态和内核态之间的切换是很费CPU的. C语言的malloc函数的后面是glibc(内存管理系统) , 前段时间在看到php内存分配时,看到了ema

探究操作系统的内存分配(malloc)对齐策略

问题: 我们在写程序的时候经常发现程序使用的内存往往比我们申请的多,为了优化程序的内存占用,搅尽脑汁想要优化内存占用,可是发现自己的代码也无从优化了,怎么办?现在我们把我们的焦点放到malloc上,毕竟我们向系统申请的内存都是通过它完成了,不了解他,也就不能彻底的优化内存占用. 来个小例子 //g++ -o malloc_addr_vec  mallc_addr_vec.cpp 编译 2 #include<iostream> 3 using namespace std; 4 int main(

@清晰掉 malloc是如何分配内存的?

任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉.但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字.实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的基本思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很容易理解. 这篇文章通过实现一个简单的malloc来描述malloc背后的机制.当然与现有C的标准库