在c语言中malloc
㈠ c语言中的malloc()包含在哪个库函数中
malloc本身就是库函数
包含在malloc.h这个头文件中
不过
由于malloc.h被更常用的stdlib.h包含。
所以平时更多用
#include
形式为
void
*
malloc(size_t
size);
功能为分配内存。
㈡ c语言中malloc是什么怎么用
malloc() 函数用来动态地分配内存空间,其原型为:void* malloc (size_t size);
说明:
【参数说明】
size 为需要分配的内存空间的大小,以字节(Byte)计。
【函数说明】
malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。如果希望在分配内存的同时进行初始化,请使用 calloc() 函数。
【返回值】
分配成功返回指向该内存的地址,失败则返回 NULL。
操作:
由于申请内存空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行后续操作。
如果 size 的值为 0,那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引用。
注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以在使用 malloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如:
#include<stdlib.h>
typedef int ListData;
ListData *data; //存储空间基址
data = ( ListData * ) malloc( 100 * sizeof ( ListData ) );
(2)在c语言中malloc扩展阅读
实现malloc的方法:
(1)数据结构
首先我们要确定所采用的数据结构。一个简单可行方案是将堆内存空间以块的形式组织起来,每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等)。
数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址 。
(2)寻找合适的block
现在考虑如何在block链中查找合适的block。一般来说有两种查找算法:
First fit:从头开始,使用第一个数据区大小大于要求size的块所谓此次分配的块
Best fit:从头开始,遍历所有块,使用数据区大小大于size且差值最小的块作为此次分配的块
两种方式各有千秋,best fit有较高的内存使用率(payload较高),而first fit具有较高的运行效率。这里我们采用first fit算法。
(3)开辟新的block
如果现有block都不能满足size的要求,则需要在链表最后开辟一个新的block。
(4)分裂block
First fit有一个比较致命的缺点,就是可能会让更小的size占据很大的一块block,此时,为了提高payload,应该在剩余数据区足够大的情况下,将其分裂为一个新的block。
(5)malloc的实现
有了上面的代码,我们就可以实现一个简单的malloc.注意首先我们要定义个block链表的头first_block,初始化为NULL;另外,我们需要剩余空间至少有BLOCK_SIZE+8才执行分裂操作
由于我们需要malloc分配的数据区是按8字节对齐,所以size不为8的倍数时,我们需要将size调整为大于size的最小的8的倍数。
㈢ C语言 malloc
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
[]
的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。
比如想分配100个int类型的空间:
int*
p
=
(int
*)
malloc
(
sizeof(int)
*
100
);
//分配可以放得下100个整数的内存空间。
另外有一点不能直接看出的区别是,malloc
只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。
对其做一个特例补充
char
*ptr;
if
((ptr
=
(char
*)malloc(0))
==
NULL)
puts("Got
a
null
pointer");
else
puts("Got
a
valid
pointer");
此时得到的是Got
a
valid
pointer。把0赋给malloc能得到一个合法的指针。
㈣ 在C语言中malloc,free,new,del,
1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2, 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存
new 是个操作符,和什么"+","-","="...有一样的地位
简单的说:
malloc,free是c的函数,new,delete是c++的运算符
此外,new是强制类型的,malloc不是,需要类型转换
当然还有很多不同
new 可以调用构造函数在声明的时候初始化
malloc只是分配空间,需要在其他地方初始化
而delete不仅会释放空间,在释放前会调用析构函数
而且malloc需要指定分配空间大小, 而new是自动计算的
㈤ C语言的malloc函数有什么用
1、这个涉及两个存储区域,堆和栈,用malloc申请的空间在堆上,char
a[10]这个是在栈上。堆和栈最重要一个区别是,栈是系统管理的的,他负责回收和释放,所以有个概念叫作用域,变量的作用域一结束,栈就回收变量的资源。但是堆是程序员管理的,程序员不释放,除非进程结束,这个空间就一直在那,就有了一定灵活性。
2、当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,即malloc函数。
malloc函数原型:extern
void
*malloc(unsigned
int
num_bytes);
头文件:#include
功能:分配长度为num_bytes字节的内存块
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针null。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
说明:关于该函数的原型,在以前malloc返回的是char型指针,新的ansic标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
㈥ C语言中怎么使用malloc函数
malloc只是动态分配内存存储空间。
void *malloc(long nBytes):该函数分配了nBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)
例如:char *Ptr = NULL;
Ptr = (char *)malloc(100 * sizeof(char));
就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了
㈦ c语言中的malloc语法
动态分配内存空间函数:
p=(分配类型 *)malloc(分配元素个数 *sizeof(分配类型))
如果成功,则返回该空间首地址,该空间没有初始化,如果失败,则返回0
实例:
char p;
p=(*char)malloc(100*sizeof(char))
㈧ C语言中的malloc函数用法>
C语言中malloc是动态内存分配函数。
函数原型:void *malloc(unsigned int num_bytes)。
参数:num_bytes 是无符号整型,用于表示分配的字节数。
注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
实现malloc的方法:
首先我们要确定所采用的数据结构。一个简单可行方案是将堆内存空间以块的形式组织起来,每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等)。
数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址 。
㈨ C语言 关于malloc的用法
char*a3;
x=strlen(a1);
y=strlen(a2);
z=x+y+1;
a3=(char*)malloc(z);