realloc函数

realloc函数函数原型void*realloc(void*ptr,size_tsize);作用realloc在原有内存基础上在堆上再分配指定数量的内存块,分配成功,返回新的地址说明在之前内存空间追加内存块成功,返回值为原内存空间指针…

函数原型

         void *realloc(void *ptr, size_t size);

作用

       realloc在原有内存基础上在堆上再分配指定数量的内存块,分配成功,返回新的地址

                 说明

                         在之前内存空间追加内存块成功,返回值为原内存空间指针

                        在之前内存空间追加内存块失败,重新申请新的内存空间,释放原内存空间,返回新申请内存空间地址

                提示

                       realloc有返回指针不是原内存空间指针的情况,使用realloc要注意验证返回值

参考例程

        char *p_1,*p_2;

        p_1 = malloc(sizeof(char)*1024);

       p_2 = p_1;   // 下面realloc函数有可能会释放这里 p_1指向的内存空间,导致p_2成为野指针

      p_1 = realloc(p_1,1024);   // 这里存在p_1指针值改变情况

realloc函数源码

    void *realloc(void *ptr, size_t size) {

            memblock_t *m;
            void *new = NULL;
     
            if (ptr) {

                    if (!(m = memblock_get(ptr))) {

                            printk(KERN_ERR “bug: realloc non-exist memory\n”);
                            return NULL;
                    }
     
                    if (size == m->size)  // 当前已用内存空间 和 新申请内存空间相等
                            return ptr;

                    if (size != 0) {

                            if (!(new = kmalloc(size, GFP_KERNEL)))
                                    return NULL;
                            memmove(new, ptr, m->size);//数据拷贝
                            if (memblock_add(new, size)) {

                                    kfree(new);
                                    return NULL;
                            }
                    }
     
                    memblock_del(m);
                    kfree(ptr);//执行到这,之前申请的内存空间会被释放
            }

            else {

                    if (size != 0) {

                            if (!(new = kmalloc(size, GFP_KERNEL)))
                                    return NULL;
                            if (memblock_add(new, size)) {

                                    kfree(new);
                                    return NULL;
                            }
                    }
            }
     
            return new;
    }

 

 

今天的文章realloc函数分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/6107.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注