真正认识 realloc 的工作方式(转载)
2014-12-31 09:00
141 查看
转自:http://www.cnblogs.com/ren54/archive/2008/11/20/1337545.html
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 用过很多次了。无非就是将已经存在的一块内存扩大。
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 的工作方式。
- 真正认识 realloc 的工作方式。
- 真正认识 REALLOC 的工作方式。
- 真正认识 REALLOC 的工作方式
- 真正认识 realloc 的工作方式。
- 真正认识 realloc 的工作方式。
- 【转载】真正认识红外调制
- 中间件的学习与认识(转载)
- (转载)Android Fragment 真正的完全解析(下)
- [转载]从Coding Fan到真正的技术专家
- 测试驱动开发 ―― 一种真正的工程化开发实践 (转载自孙鸣、邓辉)
- 长篇转载《再见,小美》-对小姐的另一种认识[三]
- UIMovieClip的一点小认识(转载)
- 转载--十年MFC经历认识的Microsoft技术
- [转载]Redis几个认识误区_TIM YANG
- C语言realloc,malloc,calloc的区别【转载】
- 转载:真正的编程高手-----激励计算机专业的大学生
- 【转载】什么才是真正的休息
- 认识物理内存4G地址空间的局限--转载
- 对线性回归,logistic回归和一般回归的认识 及Demo(转载)