zoukankan      html  css  js  c++  java
  • 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
    ", p1);
    	
    	p2 = (char*)malloc(0);
    	printf("2: p2 = %x
    ", p2);
    	
    	p3 = (char*)malloc(10);
    	printf("3: p3 = %x
    ", p3);
    	
    	p4 = realloc(p1, 20);
    	if(p4 != 0){
    		printf("4: p4 = %x
    ", p4);
    		printf("4: p1 = %x
    ", p1);
    	}else{
    		printf("4 f: p4 = %x
    ", p4);
    		printf("4 f: p1 = %x
    ", p1);
    	}
    	
    	p5 = realloc(p3, 0);
    	if(1){
    		printf("5: p5 = %x
    ", p5);
    		printf("5: p3 = %x
    ", 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
  • 相关阅读:
    [Windows] 重新安装/卸载桌面版OneDrive / Reinstall/ Uninstall Desktop Version OneDrive
    [Linux] 关闭防火墙以及开放端口
    [Java] Properties类
    [Linux] 文档编辑搜索
    [Dababase
    etymological
    [JavaScript] 表单验证不通过不提交的JS写法
    Lyrics来源
    [Maven
    [ Servlet / JSP ] J2EE Web Application 中的 JSESSIONID 是什么?
  • 原文地址:https://www.cnblogs.com/mylinux/p/4775895.html
Copyright © 2011-2022 走看看