首页 > 编程知识 正文

malloc怎么声明,malloc分配二维数组

时间:2023-05-04 06:16:00 阅读:146406 作者:3052

参考: https://blog.csdn.net/zhong 29/article/details/80930919

3359 blog.csdn.net/nyist _ zxp/article/details/80810742

一、malloc和free

1、函数声明:

void*malloc(intsize );

说明: malloc向系统申请分配大小字节内存空间,返回类型为void*型;

2、使用

int* p; p=(int* ) malloc ) sizeof (int ); free(p; //内存malloc函数的使用注意事项:

1 )、malloc返回不确定类型的指针,所以在返回之前需要进行强制类型转换。 否则会发生编译错误。

2 ) malloc即使只分配存储器,也不初始化,并且存储器空间的值可能是随机的。 如果分配的此空间本来就不使用,则每个值都可能为0。 相反,空间中可能会留下各种各样的值。

3 )、实参是应该分配的字节大小。 对于malloc(1),系统只分配一个字节的存储器空间。 在该空间中存储一个int值时,由于int类型占4字节,因此还有3字节的未分配空间,系统根据已经分配的1字节,依次向后方分配3字节的空间,注意这占用了“他人”

4 )如果不再使用分配的空间,则用free函数释放此内存空间。

5 )、释放的不是指针本身,而是指针指向的内存区域,释放后指针仍然存在。 (例如,只有在程序结束时才会丢弃变量,如指针) :

int* p; p=(int* ) malloc ) sizeof (int ); free(p; int a=10; p=a; //指针还存在,可赋值3,malloc函数的结构

1 )调用malloc函数时,malloc函数沿空闲链表(位于内存堆中)查找满足需求的内存块,并将所需大小的内存块分配给用户,其余的则分配给链路

2 )调用free函数将用户释放的内存块连接到空闲链。

3 )在调用malloc函数或多次调用后,空闲链表将被拆分为许多小内存片段。 如果用户要求较大的内存空间,则可用链表中可能没有满足需求的内存块。 在这种情况下,malloc函数会请求延迟,将空闲链表中的小内存片段组织为大内存块,并最终返回。

4 )如果得不到满足要求的内存块,malloc函数将返回空指针,因此在调用malloc动态请求内存块时,将返回一定要进行返回值的判断。

二、new和delete

1、新闻

1 )格式:

new类型名称t (初始化参数列表)。

2 )功能:

在程序运行过程中,申请用于存储t型对象的内存空间,根据初始值列表分配初始值。

3 )结果:

成果-”t类型的指针是指新分配的内存

抛出失败-”例外。

示例:

//打开单地址空间int *p=new int; //大小为sizeof(int )空间int *q=new int(5) 5; //打开大小为sizeof(int )的空间,初始化为5。 //打开数组空间//一维int *a=new int[100]{0}; //打开大小为100的整数数组空间,初始化为0。 //二维int(a ) )6)=新int ) )5) );//三维int(*a ) [5][6]=newint ) [3][5][6]; //4维以上按此类推。 2、delete

1 )格式:

删除指针p

2 )功能:

释放指针p所指的存储器

p必须是new操作的返回值

3 )示例:

//释放各个int空间的int *a=new int; 电传a; //int数组空间int *b=new int[5]; delete []b;三、两者区别

1、属性

new和delete是c关键字,需要编译器支持; malloc和free是库函数,需要头文件支持。

2、参数

使用new操作符申请内存分配时,不需要指定内存块的大小。 编译器根据类型信息进行自我计算。 malloc必须明确指定所需内存的大小。

3、返回类型

new操作符的内存分配成功后,将返回对象类型指针,类型与对象严格匹配,无需进行类型转换,因此new是符合类型安全的操作符。 malloc内存分配成功是返回void *,需要通过强制类型转换将void *指针转换为所需的类型。

4、定制类型

new首先调用operator new函数以申请足够的内存。 基础通常使用malloc实现。 然后调用类型构造函数,初始化成员变量,最后返回到自定义类型指针。 delete调用析构函数,然后调用operator delete函数释放内存。 基础通常在free中实现。

malloc/free是库函数,只能动态申请和释放内存,不能强制自定义对象的生成和析构函数的工作。

5、重载

在c中,可以自定义operator new和operator delete函数来控制动态内存分配。

6 .存储器区域

new执行两种操作:分配内存和调用类的构造函数,delete是调用类的析构函数和释放内存。 malloc和free只需要分配和释放内存。

new操作符从“自由存储”(free store )动态分配内存空间给对象,而malloc函数从堆动态分配内存。 自由存储是c基于new操作符的抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区堆是操作系统术语,是操作系统维护的特殊内存,用于动态分配程序内存c语言使用malloc从堆中分配内存,并使用free释放分配的相应内存。 自由商店和堆不一样。 如上所述,布局new可以不存在于堆中。

7、分配失败

如果新内存分配失败,将抛出bac_alloc异常(必须使用try-catch )。 如果malloc分配内存失败,则返回空值。

8、内存泄漏

内存泄漏可以在new和malloc中检测到,但new可以指示是哪个文件的哪一行,malloc不能确定。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。