C语言,realloc
void * realloc ( void * ptr, size_t new_size );
关于realloc的行为方式,结合源码总结为:
1. realloc失败的时候,返回NULL;
2. realloc失败的时候,原来的内存不改变,也就是不free或不move,(这个地方很容易出错);
3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址;
假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址;
4. 如果size为0,效果等同于free();
5. 传递给realloc的指针可以为空,等同于malloc;
6. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的。
#include <stdio.h> #include <stdlib.h> int main() { char* p1 = 1; char* p2 = 1; char* p3 = 1; char* p4 = 1; char* p5 = 1; p1 = (char*)malloc(10); printf("1: p1 = %x\n", p1); p2 = (char*)malloc(0); printf("2: p2 = %x\n", p2); p3 = (char*)malloc(10); printf("3: p3 = %x\n", p3); p4 = realloc(p1, 20); if(p4 != 0){ printf("4: p4 = %x\n", p4); printf("4: p1 = %x\n", p1); }else{ printf("4 f: p4 = %x\n", p4); printf("4 f: p1 = %x\n", p1); } p5 = realloc(p3, 0); if(1){ printf("5: p5 = %x\n", p5); printf("5: p3 = %x\n", p3); } return 0; } /* 1: p1 = 20a00 2: p2 = 21008 3: p3 = 20a18 4: p4 = 21410 4: p1 = 20a00 5: p5 = 21018 5: p3 = 20a18 分析: void *malloc(size_t size); void *realloc(void *ptr, size_t size); 1. malloc(0)成功后,返回一个非0的地址值; 2.realloc(ptr,size)成功后,返回新的地址值;ptr会被free,但这个地址值不会改变。 因此,如果使用p2 = realloc(ptr, size2)的形式,在realloc成功后,应该手动使ptr = 0,避免野指针; 如果使用ptr = realloc(ptr, size2),则不需处理。 3.realloc失败后,ptr不受影响,不会被free。 */
参考:
1. Linux Programmer's Manual http://www.man7.org/linux/man-pages/man3/malloc.3.html
2. 关于realloc的调整内存方式 http://blog.csdn.net/dadoneo/article/details/8688593