C语言的动态内存分配

本文介绍了C语言中用于动态内存分配的函数,包括malloc、calloc、realloc和free,以及new和delete在C++中的作用。同时讨论了动态内存分配可能导致的风险,如悬挂指针、重复释放和内存碎片,并提到了内存复制函数memcpy和memset的使用。
摘要由CSDN通过智能技术生成

C语言的动态内存分配

malloc

void* malloc(size_t size);

malloc将为用户分配size_t字节个内存,并且返回内存分配的地址,如果分配失败,那么返回0

int* pa=(int*)malloc(4);

pa是分配好的内存地址,4是要分配的大小

如果内存分配失败,那么pa=0

unsigned x;
std::cin>>x;

int* p=(int*)malloc(x*sizeof(int));//malloc返回值是void*类型,需要强制类型转换
if(p==nullptr)
	cout<<"内存分配失败"<<endl;
else {
    p[0]=1;
    p[1]=2;
    p[3]=3;
}

calloc

void* calloc(size_t count, size_t size);

calloc将为用户分配count乘size_t字节个内容,并且返回内存分配的地址,如果分配失败,那么返回0

int *pa = calloc(1,4);

pa是分配好的内存地址,1是要分配的元素个数,4是要分配的每个元素的大小

如果内存分配失败,那么pa=0

calloc会将分配好的内存区域设置为0

int* p=(int*)calloc(x,sizeof(int));

realloc

void* realloc(void* _Block, size_t_Size);

realloc将为用户重新分配内存,_Block是用户已经分配好的内存,Size是要求重新分配的大小,函数返回重新分配后的内存。会将数据拷贝到重新分配的内存。

int* pa=(int*)malloc(4);
pa=(int*)realloc(pa,8);

pa是重新分配后的内存的地址,8是重新分配后的大小

如果内存分配失败,那么pa=0

free

void free(void* _Block);

_Block是你要释放的内存地址。

int* pa=(int*)malloc(4);
free(pa);

pa所占用的内存被释放

new

数据类型* 指针变量名称=new 数据类型;

int* pa=new int;

数据类型* 指针变量名称=new 数据类型[数量];

int* pa=new int[5]; //分配一段能够存放5个int变量类型的内存空间

分配失败pa返回0

delete

delete 指针; //释放new分配的内存

delete[] 指针; //释放用new数据类型[]分配的内存

int* pa=new int;
delete pa;

int*pb=new int[5];
delete[] pb;

动态内存分配的风险

悬挂指针

  • 释放后再使用(可能报错可能不报)

int* p=new int[5];
delete p;
p[2]=250;
  • 重复释放(可能报错可能不报)

int* p=new int;
int* pold=p;
delete p;
delete pold;

内存碎片问题

频繁的申请和释放小块内存会造成内存碎片,虽然原则上还有内存可以使用,但是实际上由于剩余内存碎片化的存在,使得我们无法分配新的内存,当然,现在也不必太担心这样的情况,因为new和delete背后的算法会尽力规避这个风险,并且现在我们的虚拟内存也足够大,但是如果是嵌入式开发,或者要求较高的开发,就要注意这个问题,我们也可以自己来控制我们的内存分配,但这个是比较高阶的操作

补充:复制内存

void* memcpy(vid* _Dst, const void* _Src, size_t _Size);

memcpy可以将_Src区域的内存复制到_Dst区域,复制的长度为_Size字节

int a[5]{1001,1002,1003,1004,1005};
int* p=new int[5];
memcpy( p , a , 5*sizeof(int) );

补充知识:设置内存

void* memset(void* _Dst,int val,size_t _Size);

0<val<0xFF(一个字节)

int* p=new int[100];
memset( p , 0 , 100*sizeof(int) );

memset( p ,0 ); // 全设置为0
memset(p,0xff); // 全设置为-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值