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()函数将内存块释放。


#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分配的内存空间在逻辑上连续的,而在物理上可以连续也可以不连续。对于我们程序员来说,我们关注的是逻辑上的连续,因为操作系统会帮我们安排内存分配,所以我们使用起来就可以当做是连续的。


  • 41
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: malloc.h是C语言的一个头文件,它包含了一些关于动态内存分配的函数的声明和定义。在C语言中,动态内存分配是一种在程序运行时分配内存的方式,而不是在编译时确定内存大小的方式。malloc.h提供了如下函数: 1. void* malloc(size_t size):在堆区分配指定大小的内存空间,并返回一个指向该内存空间的指针。如果分配失败,则返回NULL。 2. void free(void* ptr):释放通过malloc函数分配的内存空间,将该内存空间返回给系统,这样它就可以被重新使用。注意,只能使用通过malloc函数分配的内存空间来调用free函数,否则会导致错误。 3. void* calloc(size_t num, size_t size):在堆区分配一片指定大小的内存空间,并将所有位初始化为0。与malloc不同的是,calloc会自动将分配的内存空间清零。 4. void* realloc(void* ptr, size_t size):重新分配通过malloc或calloc函数分配的内存空间的大小。如果新的大小比原来的大小大,则会在原内存块之后分配更多的空间;如果新的大小比原来的大小小,则会释放多余的空间。原内存块中的数据将被保留到新块中。 通过使用malloc.h头文件中提供的函数,我们可以在程序运行时根据需要动态地分配和释放内存空间,从而更灵活地管理内存。这在处理数据结构、字符串、图像等需要动态分配内存的场景中非常有用。 ### 回答2: malloc.h是C语言中的一个头文件,它定义了一些与内存动态分配和释放相关的函数和类型。 在C语言中,内存的分配和释放是非常常见的操作。而malloc.h提供了一些函数和类型,使得程序可以在运行时动态地分配和释放内存。 malloc.h中最常用的函数是malloc()函数,它用于分配指定大小的内存空间,并返回一个指向分配空间的指针。另外,还有一些相关的函数,如calloc()和realloc(),它们分别用于分配内存并初始化为0,以及重新分配已分配的内存空间。 除了函数以外,malloc.h还定义了一些与内存分配相关的类型。其中最常用的是size_t类型,它用于表示内存大小的无符号整数类型。在malloc.h中还定义了一些用于处理内存管理的其他类型和宏。 总之,malloc.h头文件是C语言编程中非常重要的一个头文件,它提供了一些函数和类型,使得程序能够使用动态分配内存的功能,并更加灵活地管理程序的内存使用。 ### 回答3: malloc.h是C语言中的一个头文件,它包含了动态内存分配相关的函数和常量的声明。它主要用于在程序运行时从堆中分配内存空间,并在不需要时进行释放。 在使用malloc.h之前,我们首先需要包含该头文件。在使用动态内存分配函数之前,我们通常还需要包含stddef.h头文件,以确保我们能够使用malloc.h中定义的数据类型,比如size_t。 malloc.h中最为常用的函数是malloc、calloc、realloc和free。malloc函数用于在堆中分配一块指定大小的内存空间,calloc函数类似于malloc,但会将分配的内存空间的内容初始化为零。realloc函数用于修改已分配内存空间的大小,并返回一个新的指针。最后,free函数用于释放之前通过malloc、calloc或realloc动态分配的内存空间。 使用malloc.h进行动态内存分配的好处在于,可以在程序运行时根据需要动态地分配和释放内存。这对于需要在运行时确定内存需求大小的情况非常有用,也可以提高程序的灵活性和效率。但需要注意的是,动态内存分配也需要开发者负责合理地释放已分配的内存,以避免内存泄漏和悬空指针等问题。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值