将内存扩大缩小的函数 realloc(){}

理解realloc函数与内存管理

realloc 用过很多次了。无非就是将已经存在的一块内存扩大。

char* p = malloc(1024);
char* q = realloc(p,2048);

现在的问题是我们应该如何处理指针 p。 刚开始按照我最直观的理解,如果就是直接将 p = NULL;。 到最后只需要释放 q的空间就可以了。

因为最近在做个封装。结果在做单元测试的时候发现。有时候我在 free(q); 的时候会出错。这样我就郁闷了。

后来仔细一跟踪,发现 realloc 完以后 q 和 p 的指针地址是一样。不过有时候又不一样。

仔细查了下资料。得到如下信息:

       1.如果 当前连续内存块足够 realloc 的话,只是将p所指向的空间扩大,并返回p的指针地址。 这个时候 q 和 p 指向的地址是一样的。

       2.如果 当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p指向的内容 copy到 q,返回 q。并将p所指向的内存空间删除。

这样也就是说 realloc 有时候会产生一个新的内存地址 有的时候不会。所以在分配完成后。我们需要判断下 p 是否等于 q。并做相应的处理。

这里有点要注意的是要避免 p = realloc(p,2048); 这种写法。有可能会造成 realloc 分配失败后,p原先所指向的内存地址丢失。


-----------------------------------------------------------------------前面摘自参考链接-----------------------------------------------------------------------------

我想用realloc来分配的缩小记忆体空间,我用下面的程序测试,运行正确,它会自动删掉10236-10245之间的空间,可是多添一个0就会出现段错误。

希望大家能帮我解惑。

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 main()
  4 {
  5     int i,N,M;
  6     double *P;
  7     N=10245;
  8     M=10235;
  9     P=(double*)malloc(N*sizeof(double));
 10     for(i=0;i<N;i++)
 11         P[i]=(double)i+(double)i/10;
 12     P=realloc(P,M);
 13     for(i=0;i<M;i++)
 14         printf(" %lf \n",Q[i]);
 15
 16 }





参考链接:http://www.cnblogs.com/ren54/archive/2008/11/20/1337545.html

realloc和malloc是C语言中用于动态内存分配的函数。 malloc函数用于分配指定大小的内存块,并返回指向该内存块的指针。它的原型如下: ```c void *malloc(size_t size); ``` 其中,size参数表示要分配的内存块的字节数。malloc函数会在堆上分配相应大小的内存空间,并返回指向该内存块的指针。如果分配失败,则返回NULL。 realloc函数用于重新分配已经分配的内存块的大小。它的原型如下: ```c void *realloc(void *ptr, size_t size); ``` 其中,ptr参数是一个指向先前由malloc、calloc或realloc返回的指针,或者是NULL指针。size参数表示要重新分配的内存块的新大小。realloc函数会尝试将原来分配的内存扩大缩小到新的大小,并返回指向重新分配后的内存块的指针。如果重新分配失败,则返回NULL,并且原来分配的内存块仍然有效。 需要注意的是,realloc函数可能会将原来分配的内存块复制到新的位置。如果新的大小大于原来分配的大小,那么它会在新位置上创建一个新的内存块,并将原来的数据复制到新位置。如果新的大小小于原来分配的大小,那么它会将原来内存块中前面部分的数据复制到新位置,并丢弃剩余的数据。 在使用realloc函数时,需要注意以下几点: - 如果ptr是NULL指针,则realloc的行为类似于malloc,会分配新的内存块。 - 如果size为0,则realloc的行为类似于free,会释放ptr指向的内存块。 - 如果realloc失败,会返回NULL,并且原来分配的内存块仍然有效。因此,在使用realloc函数后,应该检查返回值是否为NULL,并根据需要处理错误情况。 总结来说,malloc和realloc都是用于动态内存分配的函数,malloc用于分配内存realloc用于重新分配内存。它们在使用时需要注意参数的正确性和返回值的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值