精华内容
下载资源
问答
  • realloc函数

    千次阅读 2019-06-04 13:16:58
    函数原型 void *realloc(void *ptr, size_t size); 作用 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函数的使用

    2018-09-04 17:22:31
    realloc函数的使用在数据结构中十分重要,本文给出了使用的例子和使用的具体说明
  • malloc,relloc,calloc的区别malloc函数malloc函数作用malloc返回值relloc函数realloc函数作用calloc函数calloc函数作用 malloc函数 void *maloc( size_t size ); malloc函数作用 malloc函数作用是动态开辟一个空间,...

    一. malloc函数

    void *malloc( size_t size );

    malloc函数作用

    malloc函数作用是动态开辟一个空间,分配指定字节数的存储区,此存储区中的初始值不确定

    malloc返回值

    malloc返回一个指向已分配空间的空指针,如果可用内存不足,则返回NULL。
    若要返回指向非void类型的指针,请在返回值上使用类型转换。保证返回值所指向的存储空间对任何类型的对象的存储进行适当对齐。
    如果size为0,malloc将在堆中分配一个长度为0的项,并返回一个指向该项的有效指针。
    总是检查malloc的返回值,即使请求的内存量很小。

    举例实现

    利用malloc函数动态创建一个数组,并且数组大小由用户输入,并且输出这个数组

    #include<stdio.h>
    #include<stdlib.h>
    int main() {
    	int n = 0;
    	scanf_s("%d", &n);
    	int* ptr = (int*)malloc(sizeof(int) * n);
    	
    	for (int i = 0; i < n; i++) {
    		scanf_s("%d", &ptr[i]);//依次为变量赋值
    	}
    	printf("您输入的数值为:");
    	for (int j = 0; j < n; j++) {
    		printf("%d  ", ptr[j]);//输出数据
    	}
    	return 0;
     }
    

    二.relloc函数

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

    realloc函数作用

    realloc函数返回值
    realloc函数的作用是更改动态开辟的空间的长度,当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定。

    realloc返回值

    realloc返回一个指向重新分配(可能移动)内存块的空指针。如果大小为0且buffer参数不为NULL,或者没有足够的可用内存将块扩展到给定大小,则返回值为NULL。
    在第一种情况下,释放原始块。
    第二,原块不变。返回值指向一个存储空间,该存储空间保证对任何类型的对象的存储进行适当对齐。
    若要获得指向非void类型的指针,需要在返回值上使用类型转换。

    举例实现

    #include<stdio.h>
    #include<stdlib.h>
    int main() {
    	int n = 0;
    	scanf_s("%d", &n);
    	int* ptr = (int*)malloc(sizeof(int) * n);//动态开辟一个空间
    	int* ptr1 = (int*)realloc(ptr,sizeof(int));//调整空间大小
    	int* ptr2 = (int*)realloc(NULL, sizeof(int));//申请新的空间,功能和malloc相同
    	return 0;
     }
    
    
    
    
    

    三.calloc函数

    void *calloc( size_t num, size_t size );

    calloc函数作用

    calloc函数的作用是为指定长度的对象,分配能容纳其指定个数的存储空间,并将初始值全部赋为0。

    calloc返回值

    返回一个指向已分配空间的指针。保证返回值所指向的存储空间对任何类型的对象的存储进行适当对齐。若要获得指向非void类型的指针,需要在返回值上使用类型转换。

    使用malloc函数动态开辟一个数组,数组大小由用户输入。

    由下图可知当输入3的时候会开辟大小为三个整形的大小的数组
    输出为三个0,证明当使用malloc函数开辟数组时会将所有元素初始化为o。
    在这里插入图片描述
    代码为:

    #include<stdio.h>
    #include<stdlib.h>
    int main() {
    	int n = 0;
    	scanf_s("%d", &n);
    	int* ptr = (int*)calloc(n,sizeof(int));//动态开辟一个空间
    	for (int j = 0; j < n; j++) {
    		printf("%d  ", ptr[j]);//输出数据
    	}
    	return 0;
     }
    
    展开全文
  • realloc函数使用规则如下:1、realloc失败的时候,返回NULL;2、realloc失败的时候,原来的内存不改变,不会释放也不会移动;3、假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,...

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。

    realloc函数使用规则如下:

    1、realloc失败的时候,返回NULL;

    2、realloc失败的时候,原来的内存不改变,不会释放也不会移动;

    3、假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址;

    4、如果size为0,效果等同于free()。这里需要注意的是只对指针本身进行释放,例如对二维指针a,对a调用realloc时只会释放一维,使用时谨防内存泄露;

    5、传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的;

    6、传递给realloc的指针可以为空,等同于malloc。

    realloc函数为C语言函数。其功能为先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址,即重新分配存储器块的地址。

    展开全文
  • C语言的realloc函数

    2018-05-11 14:59:25
    realloc 使用详解(分析realloc invalid pointer、指针无效等错误) realloc函数用来为ptr重新分配大小为size的一块内存,看似很简单,在使用过程中却会发生各种错误。 函数形式为: void * realloc ( void ...

    转载自:http://www.cnblogs.com/ladd/archive/2012/06/30/2571420.html
    realloc 使用详解(分析realloc invalid pointer、指针无效等错误)
    realloc函数用来为ptr重新分配大小为size的一块内存,看似很简单,在使用过程中却会发生各种错误。

    函数形式为:
    void * realloc ( void * ptr, size_t new_size );
    最近在网上查看了一些资料,在glibc中没有找到具体的实现(有人找到了可以发给我,ladd.cn@gmail.com),查到了一个开源项目自己写的realloc代码,http://code.google.com/p/mallocspethmeniel/source/browse/trunk/realloc.c?r=23,应该和stdlib里面的实现流程一样。
    下面是我画出的函数流程图
    realloc 函数流程图
    这里写图片描述
    这个函数的工作流程:
    1.对ptr进行判断,如果ptr为NULL,则函数相当于malloc(new_size),试着分配一块大小为new_size的内存,如果成功将地址返回,否则返回NULL。如果ptr不为NULL,则进入2
    2.查看ptr是不是在堆中,如果不是的话会跑出异常错误,会发生realloc invalid pointer(具体原因在后面讲)。如果ptr在堆中,则查看new_size大小,如果new_size大小为0,则相当于free(ptr),讲ptr指针释放,返回NULL,如果new_size小于原大小,则ptr中的数据可能会丢失,只有new_size大小的数据会保存(这里很重要),如果size等于原大小,等于啥都没做,如果size大于原大小,则看ptr所在的位置还有没有足够的连续内存空间,如果有的话,分配更多的空间,返回的地址和ptr相同,如果没有的话,在更大的空间内查找,如果找到size大小的空间,将旧的内容拷贝到新的内存中,把旧的内存释放掉,则返回新地址,否则返回NULL。
    这里解释一下,为什么ptr要在堆中,学过编译原理的同学应该都知道C语言中的malloc,realloc,calloc()这种用户主动分配的内存放在堆区,而临时变量放在栈区,这是两块不同的区域。堆区的变量由用户通过free释放空间,而栈区的变量在函数退出后就自动释放,所以这两个区域的变量生存时间不同,不能相互间进行内存分配操作。所以要求ptr必须在堆区,即ptr必须是malloc,realloc或者calloc的返回值,要不然可以为NULL,把realloc变为malloc。
    所以使用realloc函数应该注意一下几点:
    1.ptr必须为NULL,或者为malloc,realloc或者calloc的返回值,否则发生realloc invalid pointer错误
    2.new_size如果小于old_size,只有new_size大小的数据会被保存,可能会发生数据丢失,慎重使用。
    3.如果new_size大于old_size,可能会分配一块新的内存,这时候ptr指向的内存会被释放,ptr成为野指针,再访问的时候会发生错误。
    4.最后不要将返回结果再赋值给ptr,即ptr=realloc(ptr,new_size)是不建议使用的,因为如果内存分配失败,ptr会变为NULL,如果之前没有将ptr所在地址赋给其他值的话,会发生无法访问旧内存空间的情况,所以建议使用temp=realloc(ptr,new_size)。
    参考文章:
    1.function realloc http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/
    2.realloc.c http://code.google.com/p/mallocspethmeniel/source/browse/trunk/realloc.c?r=23

    展开全文
  • realloc函数使用注意事项

    千次阅读 2018-11-09 16:49:37
    realloc函数使用注意事项 realloc是c语言中常用的内存重分配函数,函数声明如下: /** * 重新分配内存大小 * @param mem_address: 需要改变内存大小的指针 * @param newsize: 内存新的大小 * @return void* *...
  • realloc函数最详细解释

    千次阅读 多人点赞 2018-12-28 22:08:19
    realloc函数 语法 原型:extern void *realloc(void mem_address, unsigned int newsize); 指针名=(数据类型)realloc(要改变内存大小的指针名,新的大小)。 新的大小可大可小(如果新的大小大于原内存大小,...
  • realloc函数使用总结

    2021-01-21 17:12:06
     函数说明 语法  指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。  新的大小可大可小(但是要注意,如果新的大小小于原内存大小,可能会导致数据丢失,慎用!)  头文件  #include ...
  • calloc和realloc函数

    2016-05-05 11:03:02
    calloc和realloc函数: 函数原型: #include void *calloc(size_t number_of_elements, size_t element_size); void *realloc(void *existing_memory, size_t new_size); calloc分配的内存可以由free...
  •  C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数。使用这些函数需要包含头文件stdlib.h 1. malloc函数 malloc函数可以从堆上获得
  • malloc/calloc/realloc函数的区别及用法1.malloc函数2.calloc函数3.realloc函数 malloc/calloc/realloc函数都是分配内存,但是也存在一定的差异。 1.malloc函数 malloc函数文档 函数原型:void* malloc (size_t size...
  • 目录:1.当前我们知道的内存的使用方法2.为什么存在动态内存分配3.动态内存函数3.1 malloc 和 free(1) malloc函数...开辟10个整形大小的空间并初始化为03.3 realloc(1) realloc函数(2)realloc在调整内存空间存在的两种
  • realloc函_realloc函数

    2020-12-24 12:23:51
    原型:extern void *realloc(void *ptr, size_t newsize);用法:#include 功能:改变ptr所指内存区域的大小为newsize长度。说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用...
  • 关于c语言realloc函数分配的内存上限测试1.测试环境2.测试方法之一,使用realloc函数不断分配更多的内存2.1测试方法2.1.1 首先使用malloc分配51.2MB内存2.1.2. 然后反复调用执行下面的步骤,看看可分配的内存上限是...
  • malloc函数与realloc函数

    2010-10-18 22:16:00
    malloc函数与realloc函数(动态存储必备) malloc函数malloc函数简介 原型:extern void *malloc(unsigned int num_bytes); 头文件:#include 或 #include (注意:alloc.h 与 malloc.h 的内容是完全一致的。) 功能...
  • malloc calloc realloc三个函数的申明分别是:void* realloc(void* ptr, unsigned newsize);void* malloc(unsigned size);void* calloc(size_t numElements, size_t sizeOfElement);都在st...文章余二五2017-11-22773...
  • realloc 函数的使用

    2014-06-28 12:21:00
    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...
  • 以下是对c语言中的malloc函数,realloc函数与calloc函数的区别以及它们之间的联系进行了介绍,需要的朋友可以过来参考下 ANSI C说明了三个用于存储空间动态分配的函数 (1) malloc分配指定字节数的存储区。此存储区...
  • realloc函数和calloc函数

    2017-05-28 09:40:26
    realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。如果将分配的内存减少,realloc仅仅是改变索引的信息。  1.如果realloc()函数的第一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,506
精华内容 1,002
关键字:

realloc函数