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

C语言free释放内存后为什么指针值不变?竟然还可以输出?

今天你家范儿给大家带来一个东西——关于C语言为什么释放指针后,指向这块内存指针值不变问题编程经验!!行了,咱们话不多少,直接上主食。...正所谓”有借有还,再借不难”, 不少同学会问为什么释放指针后,指向这块内存指针值不变呢,我们今天为大家揭秘。...我们这里是VC6编译器下环境,也有部分同学反映free之后内容并未消失,这里我们分析可能是部分编译器free函数实现原理不同,欢迎大家自行尝试,并与我们交流。...而关于free之后,p之后为何没有改变,仍然还是这个原先堆空间这个地址,原因在于free函数仅仅是将malloc申请内存释放回去,所谓释放也就是告诉编译器,这块内存已经使用完毕,可以收回了。...这就是free释放内存后,指针内地址仍然存在,但有时还可以访问,有时候访问输出乱码或输出其他值原因。 怎么样,大家明白了吗?我觉得是蛮有意思,大家呢?

2.4K80

【C语言笔记】内存笔记

当频繁分配和释放内存过程中,将会出现如下情况:在两块已经分配内存之间可能出现较小未分配内存区域,这些内存理论上可以被使用。...可见,在该程序中,首先3次分配1024字节堆上内存,然后再将第二次分配内存释放,再次分配内存,将利用了这一块空间。...(5)realloc应用。realloc函数具有两个参数,一个是指向内存地址指针,另一个是重新分配内存大小,而返回值是指向所分配内存指针。...除此之外,realloc还具有两种功能:一是当指针为NULL时候,作为malloc使用,分配内存;二是当重新分配内存大小为0时候,作为free使用,释放内存。...野指针被使用或者释放指针是一个已经被释放内存指针,它指向位置已经被free或者realloc释放了,此时再使用该指针,就会导致程序错误。

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

C进阶:动态内存函数 malloc calloc realloc free及常见动态内存开辟错误

、malloc 或 realloc 所分配内存空间; 所以为了防止野指针出现出现,通常malloc calloc realloc 是成对使用;...(str); //释放开辟内存 str=NULL; //将指针置为空,防止野指针出现和使用 return 0; } 二.calloc 函数声明: 1.描述:分配所需内存空间...指针置空 return 0; } 三.realloc 函数声明: 1.描述:尝试重新调整之前调用 malloc 或 calloc 所分配 ptr 所指向内存大小; 2.参数void *...1; printf("%d\n", *arr); free(arr); arr = NULL; return 0; } 有时候由于我们未对动态开辟内存检查,而导致我们后面使用了空指针; 调试发现...;所以使用free函数释放所开辟内存空间是一定不能忘记

21010

C语言黑魔法第三弹——动态内存管理

malloc函数开辟空间一个完整空间,而不是碎片化 2、free free函数原型如下: void free(void* ptr); ptr:指向要释放内存空间指针。...释放内存空间后,应该将指针设置为NULL,以避免出现指针情况。 释放已经释放内存空间会导致未定义行为,因此应该避免重复释放同一块内存空间。...在释放内存空间后,尽量避免继续使用指向已释放内存空间指针,以防止出现悬空指针情况。...使用calloc函数分配内存空间同样需要在不再需要使用free函数释放,以避免内存泄漏。...如果扩大内存空间,新分配内存空间中数据是未定义;如果缩小内存空间,可能会丢失部分数据。 使用realloc函数重新分配内存空间,建议将返回指针赋值给原指针变量,以防止内存泄漏。

7810

解决问题Expression: public_stream != nullptr

这个错误通常会在C++程序中出现,表示指针变量public_stream为nullptr(空指针),但我们却在其上尝试进行操作。这篇文章将介绍这个错误原因以及如何解决它。...错误原因出现这个错误原因是代码中试图使用一个空指针进行操作,而不是一个有效对象。这通常发生在以下情况下:没有正确初始化指针变量。在使用指针之前未对其进行空指针检查。在对象释放后继续使用指针。...对象释放处理在程序中,如果对象已经被释放,那么指向它指针也将变得无效。在这种情况下,需要确保在使用指针之前重新分配合适内存空间,并将其初始化为nullptr。...例如:cppCopy codepublic_stream = nullptr; // 确保指针变为nullptr,避免悬挂指针问题// 重新分配内存空间和初始化指针这样可以避免使用无效指针,从而避免出现该错误...delete public_stream; // 释放对象内存 public_stream = nullptr; // 确保指针变为nullptr,避免悬挂指针问题 // 重新分配内存空间和初始化指针

34420

C语言编程—内存管理

重新调整内存大小和释放内存 当程序退出,操作系统会自动释放所有分配给程序内存,但是,建议您在不需要内存,都应该调用函数 free() 来释放内存。...DPS student.She is in class 10th 您可以尝试一下不重新分配额外内存,strcat() 函数会生成一个错误,因为存储 description 可用内存不足。...free() 函数:用于释放先前分配内存。它接受一个指向要释放内存指针作为参数,并将该内存标记为未使用状态。 calloc() 函数:用于动态分配内存,并将其初始化为零。...它接受两个参数,即需要分配内存块数和每个内存大小(以字节为单位),并返回一个指向分配内存指针。 realloc() 函数:用于重新分配内存。...它接受两个参数,即一个先前分配指针和一个新内存大小,然后尝试重新调整先前分配内存大小。如果调整成功,它将返回一个指向重新分配内存指针,否则返回一个空指针

21230

c语言基础学习08_内存管理

三、堆分配和释放、c语言几个使用堆内存库函数:malloc函数、free函数、calloc函数、realloc函数、 函数返回值为指针类型01_(即函数返回值是一个地址)、函数返回值为指针类型...如果指定地址后面没有多余空间,那么realloc会重新分配连续内存,把进内存值拷贝到新内存,并同时释放内存。...16 free(s); //free(s);并不是把自动指针变量s释放了,而是释放了s所指向那块堆内存空间。...,因为test执行完后内部自动变量a已经不在内存了,所以p指向了一个无效地址,也即变成了野指针了。..., 50 //如果指定地址后面没有空间,那么realloc会重新分配连续内存,把旧内存值拷贝到新内容,同时释放内存

1.4K10

学了指针没学动态内存一切都白搭!C语言基础教程之内存管理

该函数释放 address 所指向内存块,释放是动态分配内存空间。 在堆区分配一块指定大小内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们值是未知。...void *realloc(void *address, int newsize); 该函数重新分配内存,把内存扩展到newsize。 注意:void * 类型表示未确定类型指针。...C、C++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型指针。 编程,如果您预先知道数组大小,那么定义数组就比较容易。...而那些预先定义了大小数组,一旦定义则无法改变大小。 当程序退出,操作系统会自动释放所有分配给程序内存,但是,建议您在不需要内存,都应该调用函数free释放内存。...让我们使用 realloc 和 free 函数,再次查看上面的实例: 您可以尝试一下不重新分配额外内存,strcat 函数会生成一个错误,因为存储 description 可用内存不足。

74300

【C语言】解决C语言报错:Dangling Pointer

简介 Dangling Pointer(悬空指针)是C语言中一种常见且危险内存管理问题。它通常在指针指向内存已经被释放重新分配后继续被使用时发生。...什么是Dangling Pointer Dangling Pointer,即悬空指针,是指向已释放无效内存指针。...Dangling Pointer常见原因 释放内存后未将指针置为NULL:在释放动态分配内存后,未将指针置为NULL,导致指针仍然指向已释放内存。.../your_program 解决Dangling Pointer最佳实践 释放内存后将指针置为NULL:在调用free函数释放内存后,将指针设置为NULL,避免继续使用悬空指针。...} 避免在悬空指针上操作:在释放内存后,避免对该指针任何操作,确保指针指向有效内存

8810

Linux 命令(143)—— valgrind 命令

--freelist-vol= [default: 20000000] 当客户端程序使用 free(在 C 中)或 delete(C++)释放内存,该内存不会立即用于重新分配。...相反,它被标记为不可访问并放置在已释放队列中。 目的是尽可能推迟释放内存重新进入循环时间点。 这增加了 Memcheck 在块被释放一段时间内能够检测到对块无效访问机会。...此选项指定队列中块最大总大小(以字节为单位)。 默认值为两千万字节。 增加此值会增加 Memcheck 使用内存总量,但可能会检测到释放无效使用,否则这些释放块将无法检测到。...换句话说,这个选项增加了发现“小”块悬空指针可能性,即使在大块被释放也是如此。 将值设置为 0 意味着所有块都按 FIFO 顺序重新循环。...--free-fill= 用指定字节值填充由 free、delete 等释放块。 当试图摆脱模糊内存损坏问题,这可能很有用。

3K40

C语言进阶内置函数补充

说明:如果重新分配成功则返回指向被分配内存指针,否则返回空指针NULL。 当内存不再使用时,应使用free()函数将内存释放。 注意:这里原始内存数据还是保持不变。...分配一个newsize内存块,返回一个指向该内存指针。 如果newsize大小为0,那么释放mem_address指向内存,并返回null。...如果没有足够可用内存用来完成重新分配(扩大原来内存块或者分配新内存块),则返回null.而原来内存块保持不变。...: image.png 上面的分析基本没有问题,但有两点要注意: 1.返回值可能与ptr值不同,如果是不同的话,那么realloc函数完成后,ptr指向内存已被free释放)掉了。...故: image.png 语句有这么一个问题,调用前p指向一个已分配成功内存,而调用realloc却失败(即返回NULL),此时,p原来指向内存还没有free(释放)掉,而现在又找不到地址,这样就出现

65320

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

ptr不为空指针重新分配内存块。...常见动态内存错误 3.1 对空(NULL)指针解引用操作 动态开辟内存之后不对其返回指针进行检查就直接使用,可能会出现内存开辟失败情况,此时返回是空指针。...第一次使用free()释放指针ptr指向内存空间是符合要求正常操作;但第一次free()并没有及时把ptr置为NULL,此时ptr是指向了已经被释放内存空间,这块内存空间已经不属于本程序了。...return 0; } 3.6 动态开辟内存空间忘记释放(内存泄漏) 内存泄漏常常导致程序运行变慢罪魁祸首,我们虽然不会有意主动写出产生内存泄漏代码,但内存泄漏在我们逻辑出现漏洞还是会悄然出现...这时指针储存内容是什么就不好说了,不一定还是第二次动态开辟空间起始地址了。此时释放指针成员指向内存就是非法访问。

43710

UAF Writeup - pwnable.kr

0x00 UAF — pwnable.kr是一个韩国CTF练习网站,有很多经典CTF题目供爱好者练习。 UAF(Use After Free)释放后重用,其实是一种指针未置空造成漏洞。...在操作系统中,为了加快程序运行速度,如果释放一块n字节大小内存空间,当申请一块同样大小内存空间,会将刚刚释放内存空间重新分配。如果指向这块内存空间指针没有置空,会造成一系列问题。...当操作系统分配一块较小内存(64字节),会首先从从fastbin中寻找未使用chunk并分配。 0x02 分析 — ?...通过分析题目源代码,看到各个操作含义 调用 分配内存 释放内存 大概思路是通过3先释放内存,因为程序释放内存后没有将指针置空。故在重新分配时会出现UAF。...后话: 因为堆是8字节对齐,只要重新分配内存在9-24字节之间就可以分配到之前释放m和w。所以,程序第一个参数为9-24都可以,不过没有测试。有兴趣朋友可以测试一下。

96160

面试被问到动态内存分配需要注意哪些坑,该怎么回答?

有几种问题场景可能会出现,从而可能在完成生成后导致问题。在处理指针,您可以使用本文中信息来避免许多问题。 2.1 未初始化内存 ? 在本例中,p 已被分配了 10 个字节。...1free(memoryArea) 如果通过调用 free释放了 memoryArea,则 newArea 指针也会因此而变得无效。...每当释放结构化元素,而该元素又包含指向动态分配内存位置指针,应首先遍历子内存位置(在此例中为 newArea),并从那里开始释放,然后再遍历回父节点。...结果,func() 函数所分配 20 个字节块就丢失了,并导致了内存泄漏。 3.4 另一个指针引用释放指针 在需要深复制时候,如果浅复制,会出现问题。...每个 malloc 都要有一个对应 free。 确保您不是在访问空指针。 在需要深复制地方,如果浅复制就会出问题(一旦原指针引用内存释放后)。

1.2K30

C 语言中 malloc,free,calloc,realloc

,故编程需要通过以下方式给出:长度 * sizeof(数据类型); 示例: //动态分配内存,输入5个数据,并把低于60值打印出来 #include #include...() 函数,释放 malloc 函数申请动态内存; 注意:对于 free(ptr),若 ptr 为 NULL,则可进行多次释放,若 ptr 是非空指针,则 free 对 ptr 只能进行一次操作,否则程序将崩溃...,若足够,扩大 ptr 指向地址并返回,若不够,怎按size 指定大小分配空间,将原数据 copy 到新分配内存中,然后释放原 ptr 所指向区域; 注意:内存使用完毕后,应使用 free(...) 函数释放,但原来指针是自动释放,不需要使用free; 示例: #include #include int main() { char *...(unsigned int num,unsigned int size); 功能:为已经分配内存重新分配空间并复制内容; 注意:num:对象个数,size:对象占据内存字节数,相较于 malloc

43130

C 语言中指针内存泄漏

有几种问题场景可能会出现,从而可能在完成生成后导致问题。在处理指针,您可以使用本文中信息来避免许多问题。 未初始化内存 在本例中,p 已被分配了 10 个字节。...动态分配内存 ? free(memoryArea) 如果通过调用 free释放了 memoryArea,则 newArea 指针也会因此而变得无效。...每当释放结构化元素,而该元素又包含指向动态分配内存位置指针,应首先遍历子内存位置(在此例中为 newArea),并从那里开始释放,然后再遍历回父节点。...在对指针赋值前,要确保没有内存位置会变为孤立。 每当释放结构化元素(而该元素又包含指向动态分配内存位置指针,都应首先遍历子内存位置并从那里开始释放,然后再遍历回父节点。...始终正确处理返回动态分配内存引用函数返回值。 每个 malloc 都要有一个对应 free。 确保您不是在访问空指针

2.1K50

【动态内存管理】malloc&calloc和realloc和笔试题和柔性数组

for (int i = 0; i < 10; i++) { *(p·++) = 0; } //释放ptr指针所指向那块空间,但是ptr仍然保留着动态申请那块空间起始地址 free...(调整:调大调小均可) 重新分配内存空间函数:void* realloc(void* ptr,size_t size) 参数说明:ptr为指向那块需要重新分配内存空间那块空间,size为需要重新分配空间大小...函数释放非动态申请内存 int a = 10; int* p = &a; free(p);//error p = NULL; //way4:使用free函数释放动态申请内存一部分...(p);//error p = NULL; //way5:对同一块动态申请内存多次释放 free(p); free(p); p = NULL; //way6:忘记释放动态申请内存...包含柔型数组结构体内存大小不包含柔型数组内存大小。 包含柔性数组结构体在开辟内存得使用malloc函数动态内存开辟,且开辟空间大小必须大于结构体大小,以适应柔型数组预期大小。

48460

干货——聊聊内存那些事(基于单片机系统)

, 静态区内存直到程序全部结束之后才会被释放 l 堆区:由程序员调用malloc()函数来主动申请,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏 l...释放只能释放一次,如果释放两次及两次以上会出现错误(但是释放指针例外,释放指针其实也等于什么都没有做,所以,释放多少次都是可以),free()释放空间后可以将指针指向“NULL”确保指针不会成为野指针...可见堆空间分配内存失败则会返回NULL,并且地址指向0x00,释放只是通过free(),仅是把指向内容变成了空值,但地址还是存在,所以标准做法是赋上“NULL”值。...内存释放后(使用free函数之后指针变量p本身保存地址并没有改变),需要将p值赋值为NULL(拴住野指针)。...如果大小为 0,且 ptr 指向一个已存在内存块,则 ptr 所指向内存块会被释放,并返回一个空指针。 返回值 该函数返回一个指针 ,指向重新分配大小内存。如果请求失败,则返回 NULL。

64210

【C语言】解决C语言报错:Invalid Pointer

简介 Invalid Pointer(无效指针)是C语言中常见且危险内存管理错误。它通常在程序试图使用未初始化、已释放或不合法指针发生。...int *ptr; *ptr = 10; // 未初始化指针,导致无效指针错误 已释放指针指针指向内存已经被释放,但仍然被使用。...int *ptr = (int *)malloc(sizeof(int)); free(ptr); *ptr = 10; // 已释放指针,导致无效指针错误 野指针指针指向已释放或未分配内存。.../your_program 解决Invalid Pointer最佳实践 初始化指针:在声明指针立即初始化,避免指针指向随机内存地址。...int *ptr = NULL; // 初始化指针为NULL 释放内存后将指针置为NULL:在调用free函数释放内存后,将指针设置为NULL,避免使用无效指针

8910
领券