动态内存malloc,calloc,realloc的详细用法

对于 指针,正确的分配动态 内存是十分重要的,本文将着重阐述动态内存分配函数malloc,calloc,realloc的用法。

1.对于malloc

作用是在 内存的堆区分配一个大小为size的连续空间,如果分配内存成功,函数返回新分配内存的首地址,否则,返回 NULL,注意:鉴于上述这点,一般在写程序需要判断分配内存是否成功。

//栈的大小为1M,可配

//堆能分配的最大的分配空间为1.2G

内存是连续的,只有一个参数

我们进行一个测试:

int *arr=(int*)malloc(1024*1024*1024*1.2) //1.2G

intint *arr=(int*)malloc(1024*1024*100) //100M

此时的内存为为1.3G,没有崩溃

但是:

int *arr=(int*)malloc(1024*1024*1024*1.3) //1.3G

此时系统崩溃 了,因为内存分配需要的是连续的空间,不会在第一种情况下不会崩溃是因为那100M是内存碎片,并不连续,所以可以;但第二种是需要连续的1.3G,内存不够,所以崩溃了。堆能分配的内存为这么多,大家以后自己在申请内存的时候一定要注意。

2.对于calloc

int a=10;

int*arr=(int*)calloc(a*sizeof(int))

for(it i-=;i<n;i++)

{arr[i]=0;}

一般不多用,会自动的把每一格置0

如果要扩充容量为2倍

int *brr=(int*)malloc(2*a*sizeof(int))

for(int i=0;i<a;i++)

{brr[j]=arr[i];}

arr=brr;

brr=NULL;

3.对于realloc

int *arr=(int*)malloc(a*sizeof(int))

for(int i=0;i<a;i++) //模拟arr被使用

{arr[i]=i*10;}

malloc、colloc、realloc 三个函数都有内存泄漏:因为申请了内存,在使用过程中,并没有被释放掉,所以就会有泄漏

解决泄漏的方法:关闭程序或者设备关闭

防止内部泄漏:要释放内存,使用 free()

动态分配的内存:有头和尾信息

free()有时候会崩溃,原因有很多:

1.越界:

i:漏掉sizeof,

ii:扩大容量时:会用realloc(第二个参数)

2.动态内存中,不能移动位置,没有指向头信息,改变了指针方向

3.重复释放内存

4.释放了不是动态内存的内存 //一般不常用

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这三个函数都是C语言中用于动态内存分配的函数。 1. malloc `malloc`函数用于分配指定大小的内存块,并返回指向该内存块的指针。如果分配失败,则返回NULL。 用法:`void *malloc(size_t size);` 示例: ``` int *p = (int*) malloc(sizeof(int)*10); if (p == NULL) { printf("Memory allocation failed\n"); } else { // 内存分配成功,可以使用p指针来操作分配的内存 p[0] = 1; p[1] = 2; // ... free(p); // 使用完后需要释放内存 } ``` 2. calloc `calloc`函数也用于分配指定大小的内存块,但是与`malloc`不同的是,`calloc`会将分配的内存块的每个字节都初始化为0,并返回指向该内存块的指针。如果分配失败,则返回NULL。 用法:`void *calloc(size_t num, size_t size);` 示例: ``` int *p = (int*) calloc(10, sizeof(int)); if (p == NULL) { printf("Memory allocation failed\n"); } else { // 内存分配成功,可以使用p指针来操作分配的内存 p[0] = 1; p[1] = 2; // ... free(p); // 使用完后需要释放内存 } ``` 3. realloc `realloc`函数用于重新分配已经分配的内存块的大小,并返回指向该内存块的指针。如果分配失败,则返回NULL。如果新的内存块大小比原来的小,则可能会导致数据丢失。 用法:`void *realloc(void *ptr, size_t size);` 示例: ``` int *p = (int*) malloc(sizeof(int)*10); if (p == NULL) { printf("Memory allocation failed\n"); } else { // 内存分配成功,可以使用p指针来操作分配的内存 p[0] = 1; p[1] = 2; // ... int *q = (int*) realloc(p, sizeof(int)*20); if (q == NULL) { printf("Memory reallocation failed\n"); } else { // 内存重新分配成功,可以使用q指针来操作分配的内存 q[10] = 11; q[11] = 12; // ... free(q); // 使用完后需要释放内存 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值