首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

realloc()是否释放旧内存(当旧内存可能是指向其他内存的指针时)?

realloc()函数在重新分配内存时,会根据需要进行内存的扩展或缩小。当旧内存指针指向其他内存时,realloc()函数会将旧内存的内容复制到新分配的内存中,并释放旧内存。

具体来说,realloc()函数会根据新的内存大小重新分配内存,并返回一个指向新内存的指针。如果分配成功,则可以使用该指针访问新分配的内存。同时,realloc()函数会尽可能地将旧内存的内容复制到新分配的内存中,以保留原有数据。如果旧内存指针指向其他内存,realloc()函数会将旧内存的内容复制到新分配的内存中,并释放旧内存。

realloc()函数的使用场景包括但不限于:

  1. 动态调整数组大小:当需要改变数组大小时,可以使用realloc()函数重新分配内存。
  2. 动态管理内存:当需要根据实际需求动态分配或释放内存时,可以使用realloc()函数。

腾讯云提供了云计算相关的产品和服务,其中包括云服务器、云数据库、云存储等。具体推荐的腾讯云产品和产品介绍链接地址如下:

  1. 云服务器(CVM):提供弹性计算能力,支持多种操作系统和应用场景。了解更多:https://cloud.tencent.com/product/cvm
  2. 云数据库MySQL版(CDB):提供高可用、可扩展的数据库服务,适用于各种应用场景。了解更多:https://cloud.tencent.com/product/cdb
  3. 云对象存储(COS):提供安全、可靠、低成本的对象存储服务,适用于海量数据存储和访问。了解更多:https://cloud.tencent.com/product/cos

以上是关于realloc()函数释放旧内存的回答,以及相关的腾讯云产品推荐。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

动态内存管理基础详解

malloc申请内存空间,程序退出,还给操作系统,程序不退出,动态生气内存是不会主动释放,需要用free函数来释放。...每当free函数释放空间后,指针就没有被指向内容,为了防止野指针,需要将其设为控制在(即每次使用free函数后,都需要置成空指针) free函数不能释放非动态开辟内存空间,这种行为是标准未定义 如果...(3)、释放空间 (4)、返回新空间起始地址 疑问:那realloc返回值用原有的指针接受吗?...回答:不能,因为假如realloc增容失败,会返回空指针,而原有的指针指向空间还没有释放,就被置成空指针,这就造成了内存泄露!...malloc/calloc/realloc返回值是否为空 3.2、对动态开辟空间越界访问 3.3、对非动态开辟内存进行free释放 3.4、使用free释放一块动态开辟内存一部分 注意此时p指向不是我们动态开辟空间起始地址

9110
  • C语言动态内存管理函数

    一、内存划分 以下为C程序运行时,内存划分图: 二、malloc函数 该函数为C语言动态内存开辟函数 void* malloc(size_t size); 注意事项: 开辟成功,返回一个指针指向开辟好空间...四、realloc函数 该函数为C语言对动态开辟内存大小调整函数 void* realloc(void* ptr, size_t size); 注意事项: 指针ptr指向内存空间后,有足够空间可以扩容...,直接在后边续上新空间,返回起始地址; 后边没有足够空间扩容realloc会找一个满足空间大小连续空间。...把空间数据,拷贝新空间前面的位置,并且把空间释放掉,返回新空间地址。 realloc扩容失败,返回NULL。...五、free函数 专门做动态内存释放和回收 void free(void* ptr); 注意:         ptr是指向一片连续堆区内存空间。

    16520

    动态内存管理

    如上图,我们释放,只是释放了开辟空间,但p还是指向那个地址,因此,我们会在free之后将该指针变为空指针,否则该指针就是野指针,野指针是危险。...释放空间。 realloc函数返回新空间地址。 realloc也能做malloc能做事,如果参数1是空指针,上方realloc函数作用跟注释中malloc函数作用一样。...修改后代码如下: 题2 分析:p地址返回给str,但返回,该空间已经销毁了,即没有了该空间使用权,str指向了p所指向地址,但此时str是野指针。...题3 分析:缺少free,造成内存泄露。 题4 分析:free后,str指向空间被释放了,但他依旧指向该地址。strcpy,此时str为野指针,对野指针进行操作,非法访问内存。...在释放,只需要释放一次。 分析组1:组1先是malloc一块空间,然后在data中再malloc一块空间。空间不足,再realloc调整,然后把新空间地址传给data。

    10710

    C语言---动态内存管理

    //因为malloc返回值是void*类型指针,所以我们就强制类型转换我们期望类型指针就行了 //这个时候p就指向了这40个字节 //我们需要进行判断,判断是否开辟成功...1.动态内存大小是可以调节 2.开辟空间位置不一样 */ 这个函数向内存申请⼀块连续可⽤空间,并返回指向这块空间指针。 • 如果开辟成功,则返回⼀个指向开辟好空间指针。...//因为malloc返回值是void*类型指针,所以我们就强制类型转换我们期望类型指针就行了 //这个时候p就指向了这40个字节 //我们需要进行判断,判断是否开辟成功...对于情况二的话:1.后续空间不够的话,realloc函数直接在内存堆区开辟一个新20个字节满足大小空间 2.将数据拷贝到新空间 3.realloc函数会讲空间释放空间就用我们释放了...,realloc帮我们释放 总之: realloc函数返回地址可能是一个地址,也可能是一个新地址,也可能是一个空指针 那么我们应该拿什么东西进行指针接收呢?

    8710

    C语言进阶内置函数补充

    说明:如果重新分配成功则返回指向被分配内存指针,否则返回空指针NULL。 内存不再使用时,应使用free()函数将内存释放。 注意:这里原始内存数据还是保持不变。...这里说是“扩大”,我们知道,realloc是从堆上分配内存扩大一块内存空间realloc()试图直接从堆上现存数据后面的那些字节中获得附加字节,如果能够满足,自然天下太平。...分配一个newsize内存块,返回一个指向内存指针。 如果newsize大小为0,那么释放mem_address指向内存,并返回null。...: image.png 上面的分析基本没有问题,但有两点要注意: 1.返回值可能与ptr值不同,如果是不同的话,那么realloc函数完成后,ptr指向内存已被free(释放)掉了。...故: image.png 语句有这么一个问题,调用前p指向一个已分配成功内存,而调用realloc却失败(即返回NULL),此时,p原来指向内存还没有free(释放)掉,而现在又找不到地址,这样就出现

    66820

    【C语言】动态内存管理

    = ptr)//判断ptr指针是否为空 { int i = 0; for(i=0; i<num; i++) { *(ptr+i) = 0; } } free(ptr);//释放ptr所指向动态内存...return 0; } 看这个例子就是典型动态内存开辟和回收,malloc开辟空间,然后判断一下是不是开辟空间失败,若失败返回空指针动态内存你使用完毕之后,用free释放释放指针是野指针,...= NULL) { ptr = p; } //业务处理 free(ptr); return 0; } realloc在vs上,是情况2情况,自动释放动态空间,在新动态空间里开辟更大空间...,自动把就空间数据拷贝一份到新空间,返回新空间初始指针,所以不用再用free释放空间,只需释放realloc开批新空间,记住realloc开辟新空间也有可能开辟失败,若开辟失败,返回空指针。...*) malloc ( 100 ); p++; free (p); //p 不再指向动态内存起始位置 } 这个p指针发生改变,不在指向动态内存起始位置,释放释放p

    8210

    C语言(15)----动态内存讲解

    1.malloc void* malloc (size_t size);  该函数向内存申请一块size大小内存,然后返回指向内存指针。...若开辟成功,则返回指向内存指针; 若开辟失败,则返回空指针。...3.realloc void* realloc (void* ptr, size_t size); 该函数可以对过去已经申请过内存空间大小进行变动。...可以根据下图理解: b.开辟新空间并不冲突,那么直接根据需要扩大空间大小差值扩大,返回起始地址 然而要调整地址是空指针NULL,那么realloc作用就与malloc相同。...四.常见错误 1.申请内存为NULL,并且对其进行解引用操作,即未判读是否为空指针 2.越界访问 void test() { int i = 0; int *p = (int *)malloc(

    18510

    练习使用动态内存相关4个函数:malloc、calloc、realloc、free

    如果开辟成功,返回一个开辟成功指针。 如果失败,则返回NULL。因此,在malloc使用之前必须检查是否为空指针。 返回类型为void*,因此,返回类型由自己来决定。...realloc 有时会我们发现过去申请空间太⼩了,有时候我们⼜会觉得申请空间过⼤了,那为了合理内存,我们⼀定会对内存⼤⼩做灵活调整。...(满足新大小要求)会将原来数据拷贝一份到新空间,释放空间(realloc会主动把这块空间释放掉)。这样函数返回是⼀个新内存地址。 还有一种情况,调整失败,返回是空指针。...不用也不释放,就造成了内存泄漏问题。 malloc,realloc,calloc申请空间如果不想使用,都可以使用free来释放程序结束时候,也会由操作系统释放。...空指针没有指向有效空间, 结束最上面一个程序运行时候,str空间已经还给操作系统了,str已经是空指针了。出现对空指针解引用操作,程序崩溃,不会打印。

    13210

    【C语言】动态内存管理

    void free(void* ptr); ptr指向空间必须是动态内存开辟,否则free函数行为是未定义。如果 ptr 是空指针NULL,那就啥都不做。...return 0; } 【注意】 p指向空间在释放后不属于当前程序,但仍然存有其起始地址,此时p就是野指针。所以将p置为NULL,防止非法访问。 记得检查p是否为空指针。 记得释放申请动态内存。...答:原本申请空间出了大括号会自动释放空间,还给操作系统,但malloc申请空间需要free函数来手动释放,如果不释放,程序结束也会被操作系统自动回收,但最好手动释放。 2....返回可能是空间起始地址,也可能是新空间起始地址。...常见动态内存错误 3.1 对NULL指针解引用操作 void test() { int* p=(int*)malloc(10); *p=20; //未检测p是否为空指针,若

    6310

    动态内存管理

    2.动态内存函数介绍 2.1 malloc和free C语言提供了一个动态内存开辟函数: void* malloc (size_t size); 这个函数向内存申请一块 连续可用 空间,并返回指向这块空间指针...如果开辟成功,则返回一个指向开辟好空间指针。 如果开辟失败,则返回一个NULL指针,因此malloc返回值一定要做检查。...如果参数 ptr 指向空间不是动态开辟,那free函数行为是未定义。 如果参数 ptr 是NULL指针,则函数什么事都不做。...这样函数会把空间数据拷贝到新空间前面的位置,并把空间释放,返回是一个新内存地址。 由于上述两种情况, realloc 函数使用就要注意一些。...栈区( stack ):在执行函数,函数内局部变量存储单元都可以在栈上创建,函数执行结 束这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中,效率很高,但是 分配内存容量有限。

    9910

    【C语言】动态内存管理:malloc、calloc、realloc、free

    void* malloc(size_t size); //size单位是字节 这个函数向内存申请一块连续可用空间,并返回指向这款空间指针。 如果开辟成功,则返回一个指向开辟好空间指针。...void free(void* ptr); free函数用来释放动态开辟内存。ptr传是要释放内存空间起始地址。 如果参数ptr指向空间不是动态开辟,那么free行为是未定义。...情况二 :         1.在内存里重新找一块区域,这块区域直接满足40个字节需求。         2.把原来内容都拷贝在这个新内存里。         3.释放空间。...= NULL) //判断是否成功 { p0 = newptr; //成功了再用原来指针接管扩容后空间 } else //失败 { perror("realloc fail"); //....{ return; } for (i = 0; i <= 10; i++) { *(p + i) = i; //i为10越界访问 } free(p); p = NULL;

    12510

    动态内存分配

    C语言存在动态内存分配主要原因是为了灵活地管理内存资源。动态内存分配允许程序在运行时根据需要申请和释放内存,以满足不同需求。...行为是标准未定义,取决于编译器 C语言提供了另外一个函数free,专门用来做动态内存释放和回收,函数原型如下: void free(void* ptr) 如果参数ptr指向空间不是动态开辟,那...void *realloc( void *ptr, size_t size ); 其中,第一个参数 ptr 是指向已经分配内存指针,如果它为 NULL,则 realloc() 作用相当于 malloc...realloc返回值也是一个指针指向是重新调整之后内存块.realloc调整空间时有两种做法:1.如果后面的空间足够,则会返回地址。...2.如果后面的空间不足,该函数会重新申请一块新地址,把原空间内容拷贝下来,把原来空间释放掉,最后返回新地址。

    11110

    C语言动态内存开辟

    ,并返回指向这块空间指针。...free之后,指向内存空间被释放了还给操作系统,但是p依然有能力找到这快空间, p = NULL,主动将p赋值给空指针,彻底断开了联系,很好避免了它犯错误。...free函数用来释放动态开辟内存 如果参数ptr指向空间不是动态开辟,那free函数行为是未定义。 如果参数prt是NULL指针,咋函数什么事都不做。...,还会将原来内存数据移动到新空间 realloc在调整内存空间存在两种情况 注意事项: 如果p指向空间之后有足够内存空间可以追加,则直接追加,后返回p指向空间地址。...如果p指向空间之后没有足够内存空间可以追加,则realloc函数会重新找一块新内存区域,开辟一块满足需求空间并且把原来内存数据拷贝回来,释放内存空间。最后返回新开辟内存空间地址。

    56810

    【C语言进阶篇】常用动态内存分配 malloc calloc realloc free

    : 1️⃣ 动态内存函数 malloc 动态内存开辟函数: malloc void* malloc (size_t size); 这个函数向内存申请一块 连续可用 空间,并返回指向这块空间指针...如果开辟成功,则返回一个指向开辟好空间指针。 如果开辟失败,则返回一个NULL指针,因此malloc返回值一定要做检查。...malloc申请空间会主动释放嘛   ⛳️而malloc申请空间,程序退出,才会还给操作系统,而程序未结束,动态内存申请内存空间,是不会主动释放。这样就会照成内存浪费!...✅情况二   ⛳️当我们想用reaclloc增加空间,但是后面空间不够了就会重新开辟新空间并将原来空间内容拷贝到新空间,并且将空间释放掉....本来我p指针变量还维护40个字节大小结果你给一个空指针 那么我不仅新空间没开辟,空间也丢了, 这样就会造成内存泄漏问题,所以我们在这里就不敢用p接收我们realoc返回值,需要进行代码改进!

    42310

    【C进阶】——动态内存管理详解 及 经典笔试题解析

    所以对于calloc 返回值,我们也有必要做一下检查,判断是否为空指针。...这时候: realloc会在堆空间上另找一个合适大小连续空间来使用。这样函数返回是一个新内存地址,不再指向原空间。 而且: realloc会将原空间数据拷贝到新空间,并会将空间释放掉。...然后返回指向内存块起始地址指针。 还要一点需要注意: 我们要知道realloc第一个参数void* ptr 也可以接收一个空指针它接收是空指针时候,就相当于malloc了。...3.1 对NULL指针解引用操作 通过上面的学习我们已经知道了,malloc,realloc,calloc在开辟空间,一旦开辟失败,就会返回空指针,如果我们不小心对这些空指针进行了解引用,就会导致错误发生...这样代码运行,可能是会出错。 所以我们不要用free去释放非动态开辟内存。 3.4 使用free释放一块动态开辟内存一部分 什么意思呢?

    15910

    C语言——O动态内存管理

    二、malloc 和 free 1、malloc C语言提供了⼀个动态内存开辟函数: void* malloc (size_t size); 这个函数向内存申请⼀块连续可⽤空间,并返回指向这块空间指针...• 如果开辟成功,则返回⼀个指向开辟好空间指针。 • 如果开辟失败,则返回⼀个 NULL 指针,因此 malloc 返回值⼀定要做检查。...free(p);//释放p所指向动态内存 ptr = NULL;//防止p成为野指针 return 0; } 三、calloc和realloc 1、calloc C语⾔还提供了⼀个函数叫...这样函数返回是⼀个新内存地址,同时把数据拷贝到新空间中,然后释放空间。 由于上述两种情况,realloc函数使⽤就要注意⼀些。...栈区(stack):在执⾏函数,函数内局部变量存储单元都可以在栈上创建,函数执⾏结束这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中,效率很⾼,但是分配内 存容量有限。

    10410

    【C语言】动态内存管理之4个内存函数`malloc`,`free`,`calloc`和`realloc`深度了解

    malloc malloc函数是动态内存分配基础函数(从堆内存中动态分配指定大小内存块,并返回指向内存指针)。...malloc分配40个字节空间,p存放是分配空间首地址,malloc只知道申请多大空间,但是不知道会放什么类型数据,所以malloc函数就只能返回void*,使用void*,也就是void*...realloc函数原型: void *realloc(void *ptr, size_t size); - ptr:要重新分配内存指针,它必须指向以前通过malloc/calloc/realloc分配内存块...= NULL) { //realloc成功,ptr指向内存地址,更新p指针 p = ptr; } else { perror("realloc"); return 1; }...◦ 情况2:要扩展内存就直接原有内存之后直接追加空间,原来空间数据不发⽣变化,返回起始地址。 当然realloc也可以相当于malloc。

    34210

    【C语言】动态内存管理(heap)

    ,看返回值是否为空指针,也就是malloc函数开辟空间是否成功 3.返回值是void*,指定指针类型需要使用者自己进行强制类型转换 4.如果给malloc函数传参为0,malloc行为是C语言标准未定义...,所以一个程序出现野指针,是非常恐怖,我们要将野指针再置为空指针,也可以将置为空指针这个步骤形象理解为,让指针忘掉这块儿空间,就像你和前任分手之后,就完全忘掉她吧,不要再留着人家电话号码或微信...// 开辟你想要内存空间大小,并且把原来内存数据拷贝过来,释放内存空间,最后返回 // 新开辟内存空间地址 //3.我们得需要一个新指针变量来接收realloc函数返回值,否则一旦由于我们开辟内存空间过大...,要给free函数传参数是:动态开辟内存空间首地址,然后将其后面的空间全部释放掉 但现在指针p由于进行了后置++操作,而这样操作是会改变指针p所指向位置,所以我们不能改变p指向位置,一旦改变释放内存就会出现问题了...,但存储容量是会逐渐升高 2.值得注意是,我们第二种代码方式在释放动态开辟内存释放方式是比较繁琐,我们需要先释放结构体中指针所维护空间,然后在释放结构体所占内存空间 七、总结 本文主要给大家介绍了动态内存相关知识

    70720
    领券