c函数之realloc工作原理及其正确用法

直接给实例,然后围绕实例来谈:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
    char *p = NULL;
    char *q = NULL;
    int ret = 0;

    do
    {
        p = (char *) malloc (8);
        if (NULL == p)
        {
            printf ("malloc() error\n");
            ret = -1;
            break;
        }

        q = (char *) realloc (p, 16);
        if (NULL == q)          /* 内存分配失败 */
        {
            printf ("realloc error\n");
            ret = -1;
            break;
        }
        else                    /* 内存分配成功 */ 
        {
            p = q;
            q = NULL;
        }
    } while (0); 

    if (NULL != p)
    {
        free (p);
        p = NULL;
    }

    return ret;
}

要点:

1、realloc() 的参数一必须是经过malloc()等动态分配函数分配的指针

2、realloc() 的参数二一定要比已分配的空间大,不然会发生数据丢失错误

3、realloc() 扩展内存时,如果当前连续内存块足够 realloc 的话,只是将p所指向的空间扩大,并返回p的指针地址。 这个时候 q 和 p 指向的地址是一样的。

4、如果当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p指向的内容 copy到 q,返回 q。并将p所指向的内存空间删除。

补充说明3和4:也就是说 realloc 有时候会产生一个新的内存地址有的时候不会。所以在分配完成后,需要对其值进行判断。

当分配不成功时,返回的指针为NULL,如果不区分p和q,统一用p去接收,此时p将重新指向NULL,原来的内存将丢失,产生内存泄露。

综上,就有了上面的简单实例。


猜你喜欢

转载自blog.csdn.net/deggfg/article/details/23515319
今日推荐