c语言中malloc的使用,C语言中的Malloc()和calloc()c函数用法

2a3a99d63ff34573885992cabb36d2d6.png

无效* malloc(int size);

描述: malloc适用于系统分配指定大小的字节的内存空间. 返回类型为void *. void *表示类型不确定的指针. C,C ++规定void *类型可以强制转换为任何其他类型的指针.

可以从函数声明中看到. malloc和new之间至少有两个区别: new返回指定类型的指针,并且可以自动计算所需的大小. 例如:

int * p;

p =新的int; //返回类型为int *类型(整数指针),分配大小为sizeof(int);

或者:

int * parr;

parr = new int [100]; //返回类型为int *类型(整数指针),分配大小为sizeof(int)* 100;

Malloc必须由我们计算,并且在转换之后,它会被强制转换为实际类型的指针.

afb3b671ff6d258f696c5defe0d36f29.png

int * p;

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

首先,malloc函数返回一个void *类型. 如果您写: p = malloc(sizeof(int));则无法编译程序并报告错误: “无法将void *分配给int *类型变量”. 因此

第二,该函数的实际参数是sizeof(int),用于指示整数数据的大小. 如果您写:

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

也可以编译代码,但是实际上,只分配了1个字节的内存空间. 当您在其中存储一个整数时,将有3个字节的无家可归,并直接“居住在”邻居中!”结果是清除了后续存储器中的所有原始数据内容.

malloc还可以达到new []的效果,申请一个连续的内存,该方法只是指定所需的内存大小.

例如,如果您要分配100个int类型的空间:

int * p =(int *)malloc(sizeof(int)* 100); //分配可以容纳100个整数的内存空间.

a481471d0fbc08fa6784436af551c361.png

无法直接看到的另一点是,malloc仅分配内存,而无法初始化结果内存,因此在获得的新内存中,其值将是随机的.

除了分配和最终释放的不同方法外,还可以通过malloc或new获取指针,并使其在其他操作中保持一致.

============================================

原型: extern void * malloc(unsigned int num_bytes);

用法: #include

或#include

功能: 分配长度为num_bytes个字节的内存块

描述: 如果分配成功,则返回指向已分配内存的指针,否则返回空指针NULL.

当不再使用内存时,应使用free()函数释放内存块.

maharg_html_3019cd35.gif

malloc的语法是: 指针名=(数据类型*)malloc(长度)calloc头文件,(数据类型*)表示指针.

示例:

// malloc.c

#include

#include

main()

{

字符* p;

clrscr(); //清除屏幕

22793188099daead4ffebc5c40d92b19.png

p =(char *)malloc(100);

if(p)

printf(“内存分配在: %x”,p);

其他

printf(“内存不足!\ n”);

free(p);

getchar();

返回0;

}

============================================

malloc()函数的工作机制

malloc函数的本质是它具有一个所谓的空闲列表,该空闲列表将可用的内存块连接到一个长列表中. 调用malloc函数时,它将在连接表中查找足以满足用户请求的内存块. 然后,将存储块分为两部分(一个块的大小等于用户请求的大小,另一个块的大小为剩余字节). 接下来,将分配给用户的内存传递给用户,然后将剩余的内存(如果有)返回到连接表. 调用free函数时,它将用户释放的存储块连接到free链. 最后,自由链将被切成许多小内存片段. 如果用户此时申请较大的内存碎片,则自由链上可能没有满足用户要求的碎片. 因此,malloc函数请求一个延迟,并开始检查自由链上的内存片段,对它们进行排序,然后将相邻的较小的空闲块合并为较大的内存块.

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-254195-1.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值