malloc函数

Posted a-s-m

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了malloc函数相关的知识,希望对你有一定的参考价值。

malloc函数简介
须要包括头文件:#include ‘<stdlib.h>
函数声明(函数原型):void *malloc(int size);
函数功能:在内存的动态存储区中分配一个长度为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得到指针。在其他操作上保持一致。

以上是关于malloc函数的主要内容,如果未能解决你的问题,请参考以下文章

在一台内存为2G的机器上,malloc(20G) 会怎样?如果是new(20G) 会怎样?

Malloc 函数可以申请任意大小的堆区内存,如果 malloc(0) 会怎么样啊?这个代码好像也没有报错。

带有自定义 Malloc 函数的 CppCheck

malloc在函数内分配内存问题

是否有办法在malloc的hook函数中调用原生malloc

malloc实现机制缓冲机制文件操作mmap虚拟地址(day06)