一、堆栈是什么?程序内存分配知识点在计算机领域,栈是一个不可忽视的概念,但很多人,甚至是计算机专业人士,都没有意识到栈实际上是两种数据结构。栈是一种数据项按顺序排列的数据结构,数据项只能在一端(称为栈顶)插入和删除。
📚堆和栈的区别
堆:随机顺序:后进/先出(Last-In/First-Out);
🧱内存分配
C/C++编译的程序占用的内存分为以下几部分:栈区、堆区、全局区(静态区)、直接常量、程序代码区。
📊栈区
由编译器自动分配和释放,用于存储函数参数值、局部变量值等。它的工作原理类似于数据结构中的堆栈。
📈堆区域
一般由程序员分配和释放,如果程序员不释放,则可以在程序终止时被操作系统回收。注意,它在数据结构上与堆不同,分配方式类似于链表。
🌍全局区(静态区)
全局变量和静态变量相邻的区域存储在一起。程序运行结束后由系统释放。
📝文字常量区
常量字符串放置在这里,程序结束后由系统释放。
💻程序代码区
存放函数体的二进制代码。
🌟示例程序
这是前辈写的,很详细。
📌分配内存
分配的10和20字节的区域在堆区域。
🔍搜索字符串
123456\0被放置在常量区,编译器可以将其优化到与p3指向的“123456”相同的位置。
二、关于链表的存储空间,或者说是它到底是怎么如何实现"动态存储"的所谓空间,其实就是对应的物理内存。
实际上,所谓动态分配就是在程序执行过程中调用内存分配函数来分配内存用于存储链表中的节点信息。应该很容易理解吧?分配的内存大小就是需要的大小,比如节点的结构体大小。
至于内存分配的具体实现,简单来说,当你调用内存分配函数时,系统内部会维护一个内存分配链表,申请所需的内存,并向其中插入一个节点来做。它位于托管列表中。
这样,当你释放内存时,系统会根据这个节点记录的信息找到表并释放内存。
程序很多,可以网上搜索。自己学习如何使用搜索引擎是一个很好的学习方法。仅仅询问是不够的。
三、C语言释放链表内存的问题发布一个创建链接列表的函数。不然很难判断。
还发布了LNode和LinkList类型定义
请求发布LNode和LinkList类型定义!
从L->next;的使用中,我得出结论:LinkList是一种结构体指针,用于指向链表的头。但是当你malloc时,你使用了sizeof(LinkList)),也就是指针类型的大小通常设置为4。也就是说,你的本意是申请结构体的大小buff,但结果是你应用Size指针
如果LinkList是结构体类型,而不是指针类型,那么像s=L这样的语句是完全错误的。,其中L是局部变量,它是在进入函数时从堆栈中获取的,而不是您选择的。如此自由,你必然会失败。