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

【C语言】动态内存管理(下)(realloc函数)

那么在本文中,我将继续给大家介绍另一个非常重要且实用的动态内存管理的函数——realloc函数,以及再深入探讨一下free函数的使用细节,避免在使用动态内存函数时,由于不及时释放或者时胡乱释放所造成不必要的麻烦出现...返回值为调整之后内存空间的起始地址 这个函数调整原内存空间的大小的基础上,还会将原来内存中的数据移动到新的空间中(也就是realloc申请的内存中)。...2.3 realloc函数使用的注意事项 由于上述的两种情况,realloc函数在使用时就得注意一些细节的问题: #include #include int main...= NULL) { ptr = p; } //业务处理 free(ptr); return 0; } 我们一般使用realloc函数调整空间大小时,不会直接将要调整空间的起始地址作为接收...3.1 对NULL指针的解引用操作 void test() { int* p = (int*)malloc(INT_MAX / 4); *p = 20;//如果p的值为NULL,就会出现问题 free

10010

C语言-动态内存管理(malloc、calloc、realloc)

2.4 realloc 2.4.1 realloc是什么 realloc函数的出现让动态内存管理更加灵活,有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的使用内存...如果开辟到新的空间上,这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。...5. realloc在调整内存空间的是存在两种情况: 1)原有空间之后有足够大的空间 2)原有空间之后没有足够大的空间 3)堆区上没有那么大的空间进行开辟 2.4.2...2)原有空间之后没有足够大的空间 3)堆区上没有那么大的空间进行开辟 realloc 有可能找不到合适的空间,来调整大小这时就返回NUL 2.4.3 realloc...= p) { *p = 20; } } int main() { test(); while(1); } 内存泄漏是一个很严重的一个问题,由于test函数中的指针变量p生命周期仅限于test

1.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    浅析变长数组(VLA)和动态数组

    基本思路就是使用malloc()库函数(内存分配)来得到一个指向一大块内存的指针。然后,像引用数组一样引用这块内存,其机理就是一个数组下标访问可以改写为一个指针加上偏移量。...2.使用calloc函数为数组分配存储空间 calloc函数在中具有如下所示的原型: void * calloc ( size_t nmemb , size_t size ); calloc...例如下列calloc函数调用为n个整数的数组分配存储空间,并且保证所有整数初始均为零: a=calloc(n,sizeof(int)); 3.使用realloc函数调整数组的大小 一旦为数组分配完内存,...realloc函数可以调整数组的大小使它更适合需要。...在要求减少内存块大小时,realloc函数应该“在原先的内存块上”直接进行缩减,而不需要移动存储在内存块中的数据。同理,扩大内存块时也不应该对其进行移动。

    2K21

    C语言详解(动态内存管理)1

    ,不能指定大小 数组在声明的时候必须指定长度,数组空间一旦确定下来就不能调整 数组空间在申请前我们不能给出一个准确的大小,大了浪费,小了不够 有时候我们需要的空间大小在程序运行的时候才能知道...,指针p中还保留着其地址,安全起见我们需要给指针p赋NULL,因此free(p)和p = NULL总是一起出现的 既然有free函数,所以说明动态内存是不能自动回收的,所以malloc申请的空间和数组又有了一个区别...0,而malloc不会 3.2 realloc 在文章开头我们提到了,有时在定义数组的时候我们并不能给定数组一个准确的长度,大了浪费,小了不够。...而realloc函数的出现让动态内存管理更加灵活,它的作用是调整动态内存空间的大小,原型如下: void *realloc( void *ptr, size_t new_size ); ptr:指向之前通过...函数将一个动态内存空间调整的小一点,则相应的动态内存空间就会减小到我们想要的大小;而当我们想用realloc函数将一个动态内存空间调整的大一点,这时候就会有两种情况出现: 情况一:原内存后的可用空间足够我们的扩容

    11210

    【熟视C语言】C语言动态内存管理(malloc,calloc,realloc,free)

    而在我们实际生活中又确实会出现一组数据量会随时变化的数据组。这时我们就需要使用动态内存函数来为数组,变量来开辟空间。...动态内存函数 (函数声明在头文件stdlib.h中) malloc和free malloc是C语言提供的一个开辟动态内存的函数。...返回值的类型是void*指针,具体使用时只需要对返回的指针进行强制类型转换即可。 在标准中malloc并未对size是0的情况进行规定,具体情况看编译器。...realloc在调整内存空间大小时存在两种情况: 一:在原有空间之后又足够大的空间(即没被其他数据占用)。 这种情况直接原地扩容,追加原有数据后方的空间且不对原有数据做出改动。...这里总结几个比较常出现的错误,希望对你的使用有所帮助。

    19910

    C语言之动态内存管理

    2.free函数 一般与malloc、ralloc、realloc等开辟空间的函数配套使用; 例如:malloc开辟空间,free在使用完空间后将开辟的动态空间释放掉 注意 1、free(p)之后,p...realloc (p,size)//p是指向原空间首地址的指针,size是调整后动态内存空间的大小。...1.调整空间大小时可能出现的情况  1.原空间后方连续空间的大小足够调整空间到所需要的空间大小,此时直接在原空间后方开辟新的空间,返回原空间的首地址;  2.原空间后方连续空间的大小不足以调整空间到所需要的空间大小...为了防止这种情况的出现,就需要一个中间变量先接收realloc的返回值,再对返回值进行判断,如果返回值不为NULL的话,再用指向原地址的指针接收返回值。...,在主函数使用完这块空间之后忘记释放。

    58530

    关于我、重生到500年前凭借C语言改变世界科技vlog.21——动态内存管理

    的内存大小,但是在实际运行中,当你试图使用malloc(INT_MAX) 时,几乎肯定会导致内存分配失败,这只是一个理论上存在的值,malloc 函数会返回 NULL ,这是因为系统没有足够的连续空闲内存来满足这样大的请求...当系统内存不足时,程序可能会出现性能下降、运行缓慢甚至崩溃的情况 1.2.2 free的使用 释放和回收动态内存的函数为 free ,声明在 stdlib.h 头文件中 传送门:free-C++参考...,声明在 stdlib.h 头文件中 传送门:realloc-C++参考 参数:ptr-指向先前使用或分配的内存块的指针,size-元素大小 返回值:指向重新分配的内存块的指针 值得注意的是: •...ptr 是要调整的内存地址 • size 调整之后新大小 • 返回值为调整之后的内存起始位置 • 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间 • realloc 在调整内存空间的是存在两种情况...类型数据的内存需求),realloc 函数会返回 NULL,但这里的问题是,当它返回 NULL 时,原始的 ptr 所指向的内存块已经被释放(因为 realloc 在尝试重新分配失败时,会释放掉原始的内存块以避免内存泄漏

    9310

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

    ,我们可以使用calloc函数 2.4 realloc函数 realloc函数的出现让我们的动态内存开辟变得更加灵活。...有的时候我们会觉得动态内存开辟的空间较大,有的时候又嫌开辟的空间较小,所以为了更高效的使用内存空间,我们就可以使用realloc函数对动态开辟的空间进行大小调整,以满足使用者的需求。...//假设这里,20个字节不能满足我们的使用 //我们希望有40个字节的空间 //这里就可以使用realloc函数来调整动态开辟的内存 int* p2 = realloc(p, INT_MAX)...字节大小的空间,但使用时,却超出了我们开辟的空间大小,这样就会造成越界访问,程序出现问题 3.3 对非动态内存开辟的内存使用free函数释放 int main() { int a = 10; int...,所以离开函数时,指针变量会被销毁,而内存空间是不会被销毁的,如果你的空间并未在堆区上开辟,而是在栈区的话,那必然会被销毁 我们这里再补充一个野指针的定义:以免我们以后写程序时写出野指针,从而出现大问题

    73020

    【C语言】realloc()函数详解(动态内存开辟函数)

    二.realloc()函数的具体使用 realloc()函数的使用场景是:当我们想调整先前使用malloc(),calloc()或realloc()函数开辟的动态内存的大小时,我们可以使用realloc...()函数来实现这一诉求. 1.使用realloc()函数完成动态整型数组空间的扩容 如下,我们使用realloc()函数调整一个有10个元素的整型数组的大小将其改为15个整型元素....p = NULL; //将指针p置为NULL,防止其变成野指针 return 0; } 在vs编译器中运行查看结果: 可见realloc()函数成功的将malloc(...} 在vs编译器中查看结果: 可见realloc()函数成功的将结构体的元素个数由3个改为了5个....三.realloc()的异地扩容 使用realloc()函数调整内存空间存在两种情况: 原有空间之后有足够大的空间 原有空间之后没有足够大的空间 如:图中绿色空间是我们之前动态开辟的内存空间,而现在我们想使用

    49710

    C语言——动态内存管理

    calloc函数   3.2 realloc realloc : 用来调整空间大小 1.realloc函数的出现让动态内存管理更加灵活 2....那realloc 函数就可以做到对动态开辟内存大小的调整  1.ptr 是要调整的内存地址 2.size 调整之后新大小 3.返回值为调整之后的内存起始位置。...4.这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间 realloc在调整内存空间的是存在三种情况: 情况1:原有空间之后有足够大的空间: 当为情况1 的时候,要扩展内存就直接原有内存之后直接追加空间...1.在堆区的内存中找一个新的空间,并且满足新的空间大小要求 2.会在原来的空间的数拷贝一份放到新空间里 3.释放旧地址 4.返回新内存空间的起始地址 情况3:调整失败,返回NULL 4.常见的动态内存的错误...动态开辟的空间一定要释放,并且正确释放  malloc和free最好要一起出现,做的谁申请的空间谁释放,如果不能释放,要告诉使用的人要记得释放 5.柔性数组 结构中的最后一个元素允许是未知大小的数组,

    11710

    c语言动态内存管理

    那 realloc 函数就可以做到对动态开辟内存⼤⼩的调整。...,就会有问题 free(p); } INT_MAX 是一个非常大的值,通常是 2^31 - 1(在32位系统中),即 2147483647。...总计一下,动态内存空间的释放一共就两种方式,第一种就是使用free函数,第二种就是等待整个程序的结束吗,整个程序结束后,动态内存的空间就被释放掉了,在一些服务器中,需要24小时不停止的运行,因此动态空间忘记释放之后...,并不能通过程序结束来释放,因此在使用完动态空间之后,一定要进行空间的释放,并且把指向动态空间的指针置为空指针,防止出现野指针。     ...第⼀个好处是:⽅便内存释放 如果我们的代码是在⼀个给别⼈⽤的函数中,你在⾥⾯做了⼆次内存分配,并把整个结构体返回给⽤⼾。

    4500

    【C语言必学知识点七】坚决不允许你还不知道CC++程序如何对内存进行分区!!!

    现在动态内存管理的内容我们就介绍完了,接下来我们就来继续探讨一下如何正确的使用动态内存; 二、常见的动态内存的错误 在动态内存管理中,由于整个过程分别涉及到栈区的指针变量以及堆区的内存空间,因此我们如果使用不当的话...在动态内存管理中,大致有以下几点常见错误: 2.1 内存开辟失败后对空指针进行解引用 malloc、calloc和realloc这三个函数在申请内存空间时都会存在两种情况: 内存开辟成功:返回指向内存起始地址的指针...内存开辟失败:返回空指针 因此,如果我们在进行内存申请后,未对返回值及时的进行判空操作,那么就很容易在后续操作中出现对空指针解引用的问题。...为了避免这个问题的出现,我们就需要特别注意指针名以及空间申请的方式。传入到函数的指针一定得是指向由动态函数开辟的空间。...test11函数中申请的空间释放,使得堆区中的内存被占用,从而影响了后续的使用; 因此为了避免出现这种问题,我们一定要记住,只要有进行内存空间的申请,那么就需要有一次对应的内存空间释放,如下所示: 那是不是说只要我们像这样处理就行了呢

    8710

    【c语言】动态内存管理

    二、动态内存管理相关函数 1.malloc malloc函数是c语言的库函数,使用时要引头文件stdlib.h,它用于在内存中开辟一块空间,如果开辟成功,返回值是指向这块空间的起始地址,否则返回空指针...它的函数原型: void* malloc(size_t size); 注意:函数的参数是要申请的空间的大小;由于返回值是void*类型,在使用它时要进行强转。...在第二种情况下,如果内存增容失败并且我们使用原来的指针变量接收,由于返回值是空指针,这导致原有的内存空间也会丢失,真是赔了夫人又折兵。...所以我们在使用realloc的时候,应该先创建一个临时变量来接收这个地址,如果它不为空指针,再赋值给指向起始地址的指针。...; } return 0;//将导致内存泄漏 } 总结 本篇文章我们学习了动态内存管理的相关知识,了解到了动态内存开辟的原因,认识了几个新函数,以及意识到动态开辟内存会常常出现一些问题,我们要学会取规避这些情况

    14510

    C语言进阶——动态内存管理

    ---- 正文   C语言中的动态内存开辟函数有三个:malloc、calloc 和 realloc,有开辟就要有释放,一般在使用以上三个函数时,都会配套使用一个 free 来进行内存释放。...纠正方案   将数据存放在静态区中,这样在函数 Test 中也能使用了。   至于为什么不直接在堆上申请,使用完后释放?...,而这些问题在柔性数组中可以得到避免 柔性数组的优势   既然柔性数组是作为一个C语言的新特征而出现的,那么其设计者在设计语法的时候肯定考虑到了上面的问题,于是才会出现这么个新特征。...这样我们以后在编写程序的时候,就可以不用把数据全都存放在栈区了,可以往堆区中存,毕竟那儿空间大;还可以通过函数灵活使用堆区中的空间,我想这正是C语言灵活强大的原因之一吧。...能力越大,责任越大,我们在每次使用完开辟出的空间后,都要对其进行释放,不要引发内存泄漏这样的严重问题。总而言之,我们可以去尝试使用动态内存管理函数了!

    52710

    动态内存管理

    2.2 realloc realloc函数是用来调整动态空间的大小的,可以调大,也可以调小,其函数原型为: void* realloc(void* ptr,size_t size); prt指向要调整的内存空间...调整空间有两种情况: a.原有空间之后有足够大的空间 如图,ptr所指的空间有后又足够的空间,那么调大的空间就会直接追加在原来的空间,函数返回的空间地址跟原地址相同,原来的数据不会发生变化。...注意: 1.realloc函数的指针形参是指向堆区动态空间的指针,并不是栈区的普通指针。 2.时候用realloc时,由于情况不确定,所以通常用一个新的临时指针来接受realloc的返回值。...使用临时指针的原因:如果使用原指针,若是realloc开辟空间失败,那么会返回一个空指针,造成原指针不再指向原空间,也就找不到到来的数据,造成内存泄漏。...; return 1; } int* ptr;//临时指针 ptr = (int*)realloc(p, 20* sizeof(int));//使用临时指针接收调整后的空间 if (ptr=

    3900

    C语言进阶(十二) - 动态内存管理

    动态内存分配出现的原因 我们首先接触到的向操作系统申请空间的方法往往是创建一个变量、数组的形式,这样申请的是固定的内存大小,往往不能够很好地满足需要。比如申请小了不够使用,申请大了存在浪费。...动态内存很好地解决了这样的问题,我们可以先申请一块空间,小了就在申请大一点的空间,大了也可以申请小一点的空间。...realloc()函数在调整原来内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。 当传入的**ptr**是空指针时,realloc函数相当于malloc函数的功能。...,但内存泄漏在我们逻辑出现漏洞时还是会悄然出现,导致程序出现随运行时间增加而显现的问题。...---- 结语 本文主要介绍了动态内存管理中的函数malloc()、calloc()、realloc()和使用方法;接着介绍了在动态内存开辟和使用中可能会出现的问题;最后介绍了柔性数组的概念,虽然它并不常使用

    55310
    领券