zoukankan      html  css  js  c++  java
  • realloc()函数

    原型:extern void *realloc(void *mem_address, unsigned int newsize);
    参数:    mem_address:    要改变内存大小的指针名
            newsize    :        新的内存大小。

    如果分配内存减少,realloc仅仅改变索引的信息。

    如果将分配的内存扩大,则有一下几种情况:

    1) 如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回元指针。

    2) 如果当前内存段后面的空闲字节不够,那么就实验堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并把原来的数据块释放掉,返回新的内存块位置。

    3) 如果申请失败,将返回NULL,此时,原来的指针仍有效。

    注意:如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针

    /***
    realloc.c
    ***/
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(int argc,char ** argv)
    {
        int input;
        int n;
        int *numbers1;
        int *numbers2;
        numbers1 = NULL;
    
        if( (numbers2 = (int*)malloc(5*sizeof(int))) == NULL)
        {
            printf("malloc memory unsuccessful");
            exit(1);
        }
    
        printf("numbers addr:%8X
    ",(int)numbers2);
    
        for(n = 0; n < 5; n++)
        {
            *(numbers2+n) = n;
            printf("numbers2's data %d
    ",*(numbers2+n));
        }
    
        printf("Enter new size: ");
        scanf("%d",&input);
    
        numbers1 = (int *)realloc(numbers2,(input+5)*sizeof(int));
    
        if(NULL == numbers1)
        {
            printf("Error (re)allocating memory");
            exit(1);
        }
    
        printf("numbers1 addr: %8X
    ",(int)numbers1);
    
        for(n = 0; n < input; n++)
        {
            *(numbers1+5+n) = n + 5;
        }
    
        printf("
    ");
    
        free(numbers1);
        numbers1 = NULL;
        
        return 0;
    }

    如果当前内存段有足够的空间,realloc()返回原来的指针:

    ubuntu14-04@ubuntu:~/ShareWin/shiyanlou/C/file$ ./realloc
    numbers addr:  D07010
    numbers2's data 0
    numbers2's data 1
    numbers2's data 2
    numbers2's data 3
    numbers2's data 4
    Enter new size: 10
    numbers1 addr:   D07010

    当前内存段没有足够的空间,realloc()返回一个新的内存段的指针:

    ubuntu14-04@ubuntu:~/ShareWin/shiyanlou/C/file$ ./realloc
    numbers addr: 25E8010
    numbers2's data 0
    numbers2's data 1
    numbers2's data 2
    numbers2's data 3
    numbers2's data 4
    Enter new size: 10000
    numbers1 addr:  25E8010
  • 相关阅读:
    删除链表中的一个节点
    链表系列面试题1
    线程的5种状态
    红黑树 实现
    Java的SPI机制浅析与简单示例
    socket原理
    rabbitmq简单介绍
    MongoTemplate操作mongodb
    RJava配置
    浅析前后台分离
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11606187.html
Copyright © 2011-2022 走看看