打印

malloc用法

[复制链接]
1611|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bit6019|  楼主 | 2011-1-15 12:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
需要包含头文件:
#include 'stdlib.h'
函数声明(函数原型)
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 []
的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。比如想分配100int类型的空间:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。


另外有一点不能直接看出的区别是,malloc
只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
除了分配及最后释放的方法不一样以外,通过mallocnew得到指针,在其它操作上保持一致。
free用法
需要包含头文件(
malloc
一样)
#include 'stdlib.h'
函数声明:
void free(void *block);
即:
void free(指针变量)


之所以把形参中的指针声明为
void*
,是因为free必须可以释放任意类型的指针,而任意类型的指针都可以转换为void *


举例:


int* p = (int *) malloc(4);



*p = 100;


free(p); //释放
p
所指的内存空间


或者:


int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。


……


free(p);


free
不管你的指针指向多大的空间,均可以正确地进行释放,这一点释放比
delete/delete []
要方便。不过,必须注意,如果你在分配指针时,用的是newnew[],那么抱歉,当你在释放内存时,你并不能图方便而使用free来释放。反过来,你用malloc
分配的内存,也不能用delete/delete[]
来释放。一句话,new/deletenew[]/delete[]malloc/free
三对均需配套使用,不可混用!
int* p = new int[100];
free(p);     
//ERROR! p
是由new
所得。



函数malloc()calloc()都可以用来动态分配内存空间,但两者稍有区别。


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 <mallco.h>


i nclude <stdlib.h>

相关帖子

沙发
无冕之王| | 2011-1-15 15:59 | 只看该作者
又是普及教育

使用特权

评论回复
板凳
米其林r| | 2011-1-18 13:37 | 只看该作者
好东西,平时用的不多,不熟悉啊

使用特权

评论回复
地板
bit6019|  楼主 | 2011-1-31 22:42 | 只看该作者
这个在做嵌入式哪个应用的时候用的比较多

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

221

主题

1344

帖子

1

粉丝