zoukankan      html  css  js  c++  java
  • realloc 函数的使用

    realloc 函数的使用

    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    using namespace std;
    void setVal(char *tmp,int qs,int num,char mm)
    {
     for(int i=qs;i<num-1;i++)
     {
      *(tmp+i)=mm;
     }
     *(tmp+num-1)='';
    }
    int main()
    {
     char  *p,*q;
    
    
     
     //缩短内存
     p = (char * ) malloc (1000);
     setVal(p,0,1000,'a');
     q = (char *) realloc (p,800);
     if(q!=NULL)
     {
      setVal(q,795,800,'S');
      cout<<q<<endl;
      cout<<"Success"<<endl;  
     }
     else
     {
      setVal(p,500,800,'F');
      cout<<"Fail"<<endl;
     } 
     free(q);
     getchar();
     getchar();
     system("pause");
     return 0;
    }

    realloc 可以对给定的指针所指的空间进行扩大或者缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。 

    realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc 返回的指针很可能指向一个新的地址:

        因为realloc是从堆上分配内存的,当扩大一块内存空间时, realloc直接从堆上现存的数据后面的那些字节中获得附加的字节;但如果数据后面的字节不够的话,那么就使用堆上第一个有足够大小的自由块,现存的数据然后就被拷贝至新的位置,而老块则放回到堆上。
    在代码中,

    如果我们采用i = (int*)realloc(i, 2*sizeof(int))的重新分配内存方式,有以下两种情况:

    1.分配成功,返回void*指针:realloc返回值如果与前面malloc的值不同,那么realloc函数完成后,i指向的旧内存自动free掉。

    2.分配失败,返回NULL值:此时,i原来指向的内存还没有被free掉,而现在又找不到地址,这样就出现memory leak了。 

        解决办法:定义另一个指针j用于接收realloc返回值,判断是否成功,成功则将j赋给i


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/leopardaa521/archive/2009/10/12/4658887.aspx

  • 相关阅读:
    2所非211院校挺进全球高校600强,甩开一众985 | 泰晤士世界大学排行榜出炉
    深度强化学习专栏(三)
    PyTorch专栏(八):微调基于torchvision 0.3的目标检测模型
    PyTorch专栏(六): 混合前端的seq2seq模型部署
    3分钟了解GPT Bert与XLNet的差异
    PyTorch专栏(五):迁移学习
    NLPer,你知道最近很火的自然语言处理库么?
    E
    网络流 I
    D
  • 原文地址:https://www.cnblogs.com/mjorcen/p/3813223.html
Copyright © 2011-2022 走看看