曲径通幽论坛

标题: realloc() -- 改变内存区长度 [打印本页]

作者: beyes    时间: 2011-5-23 22:39
标题: realloc() -- 改变内存区长度
realloc() 函数可以增加或减少之前分配的内存区长度,在一般使用中大都是用来增加长度。比如,之前分配一个 256 字节的空间,但是在程序运行一段时间后忽然发现空间不够了,那么就用 realloc() 进行空间的扩展。realloc() 的原型声明如下:
[C++] 纯文本查看 复制代码

#include <stdlib.h>
void *realloc(void *ptr, size_t size);

在对存储空间扩展时,如果在原来的空间后还有足够大的存储区,那么就在使用这后面的空间进行扩充,此时函数的返回指针和第 1 个参数 ptr 一样,并且无需移动原来空间的任何内容。


如果原来的存储区后没有足够的空间,那么 realloc() 就需要去寻找一块足够大的空间来满足扩充需求,在此过程中函数会将原先空间中的数据复制到新的空间中,然后释放掉原先空间的指针(ptr),然后返回一个新空间的指针。


上述过程很像是为你的家扩建和搬家,当原住地可以扩建时就在原住地扩建,否则只能搬家了。


需要注意的是,realloc() 的第 2 个参数 size 是调整后的内存区的长度,它并不是新、旧存储区长度之差。如果 ptr 是个空指针,那么 realloc() 的功能就和 malloc() 相同了。


下面程序演示了 realloc() 进行空间调整(先缩小检测再扩充检测)的示例:
[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char **argv)
{
        char *pmem1;
        char *pmem2;


        int i;


        pmem2 = pmem1 = (char *)malloc(10);
        for (i = 0; i < 10; i++)
                *pmem2++ = 'X';


        pmem2 = (char *)realloc(pmem1, 5);
        pmem1 = pmem2;


        for (i = 0; i < 5; i++) {
                if (*pmem2++ != 'X') {
                        printf ("Error:!\n");
                        exit (EXIT_FAILURE);
                }
        }
        printf ("realloc for redusing 5 bytes succeeded\n");


        pmem2 = (char *)realloc(pmem1, 15);
        pmem1 = pmem2;
        for (i = 0; i < 5; i++) {
                if (*pmem1++ != 'X') {
                        printf ("Error:realloc changed memory contents!\n");
                        exit (EXIT_FAILURE);
                }
        }
        printf ("realloc 15 bytes succeeded!\n");
        free(pmem2);


        return 0;
}


运行输出:
[beyes@SLinux syscall]$ ./realloc
realloc for redusing 5 bytes succeeded
realloc 15 bytes succeeded!





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2