malloc.h头⽂件和malloc函数详解
malloc.h:头⽂件,当对内存区进⾏操作时,调⽤相关函数.ANSI标准建议使⽤stdlib.h头⽂件,但许多C编译要求⽤malloc.h,使⽤时应查阅有关⼿册。
⼀、原型:extern void *malloc(unsigned int num_bytes);
头⽂件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全⼀致的。)
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使⽤时,应使⽤free()函数将内存块释放。molloc函数
#include<stdio.h>
#include<malloc.h>
int main()
{
char *p;
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x/n",p);
else
printf("Not Enough Memory!/n");
free(p);
return 0;
}
⼆、函数声明(函数原型):
void *malloc(int size);
说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表⽰未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
三、malloc与new的不同点
从函数声明上可以看出。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()函数其实就在内存中⼀⽚指定⼤⼩的空间,然后将这个空间的⾸地址范围给⼀个指针变量,这⾥的指针变量可以是⼀个单独的指针,也可以是⼀个数组的⾸地址,这要看malloc()函数中参数size的具体内容。我们这⾥malloc分配的内存空间在逻辑上连续的,⽽在物理上可以连续也可以不连续。对于我们程序员来说,我们关注的是逻辑上的连续,因为操作系统会帮我们安排内存分配,所以我们使⽤起来就可以当做是连续的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论