首页 > 编程知识 正文

c堆和栈,堆栈和栈是同一个东西吗

时间:2023-05-06 09:06:24 阅读:31196 作者:3299

c语言中堆和堆栈的区别是什么

堆栈在计算机领域是一个不容忽视的概念,对于大多数初学者来说,堆栈是一个模糊的概念。 本文就百分网小编搜索整理的c语言中堆和栈的区别,供大家参考阅读,希望对大家有帮助! 想了解更多信息,请继续关注应届毕业生考试网!

堆栈:数据结构,程序运行时存储的位置,这可能是很多初学者的认识。 我这么想是因为和汇编语言的堆栈这个词混淆了。 我身边的编程朋友和在网上看帖子遇到的朋友中,有很多不算堆栈。 所以,我认为有必要和大家分享我对堆栈的看法。 如果有错误的地方,请朋友告诉我吧。 这对大家的学习很有帮助。

一.前言:

通过对c语言程序进行编译连接而形成的二进制图像文件包括堆栈、堆、数据段(只读段、读写数据段正在初始化的未初始化段)和BBS 请参照下图。

1 .堆栈区域(stack ) :由编译器自动分配并释放,存储函数的参数值、局部变量值。 其行为就像数据结构中的堆栈一样。

2 .堆(heap ) :一般由程序员分配和释放,如果程序员不释放,可能会引起内存泄漏。 注堆和数据结构中的堆栈不同,其类与链表相同。

3 .程序代码区域:存储函数体的二进制代码。

4 .数据段:由三部分组成。

1只读数据段:

只读数据段是程序使用的不变数据,用于查找表等操作中。 由于这些变量不需要更改,因此只需将其放置在只读存储器中即可。 通常,const限定变量和程序中使用的字符常量存储在只读数据段中。

2初始化的读/写数据段:

初始化的数据是一个在程序中声明并具有占用内存空间初始值的变量,必须位于程序运行时可读写的内存区域内,并具有初始值以便在程序运行时读写。 程序中一般初始化的全局变量、初始化的静态局部变量、静态限定的初始化变量

3未初始化的段:

未初始化的数据在程序中声明,但没有初始化的变量在程序运行之前不需要占用内存空间。 与读/写数据段一样,属于静态数据区。 但是,该段的数据尚未初始化。 未初始化的数据段只在正在运行的初始化阶段生成,因此不影响目标文件的大小。 在程序中,未初始化的全局变量和未初始化的静态局部变量很常见。

2 .堆和堆栈的区别

1 .申请方式

(1)堆栈(satck ) :由系统自动分配。 例如,声明函数内局部变量int b; 系统会自动在堆栈中为Web打开空间。

)2)堆(heap ) :需要程序员自己申请(调用malloc、realloc、calloc ),指定大小,由程序员释放。 内存链路容易发生。

eg:char p;

p=(char* ) malloc ) sizeof (char );

但是,p本身在堆栈中。

2 .申请大小限制

)堆栈)在windows上,堆栈是扩展到底部地址的数据结构,是连续的内存区域(沿与内存增长方向相反的方向增长)。 堆栈的大小是固定的。 如果申请的空间超过了堆栈的剩馀空间,则呈现溢出。

)堆:堆是地址扩展较高的数据结构,在与内存增长方向相同的方向上增长,是不连续的内存区域。 这是因为系统使用链表存储空闲内存地址,所以当然是不连续的,链表的遍历方向从底部地址指向高地址。 堆的大小受计算机系统中的有效虚拟内存限制。

3 .系统响应:

(1)堆栈:只要堆栈的区域大于申请的区域,系统就会为程序提供内存。 否则,报告异常并告知堆栈溢出。

)堆)首先,应该知道操作系统中有一个链表,记录空闲内存地址,但是系统在收到程序申请时,会在这个链表中循环,第一个空间就是接收到申请的空间此外,在大多数系统中,在此内存空间的第一个地址中记录此次分配的大小可以正确释放代码中的free语句,并且找到的堆节点大小不一定与申请的大小相同,多余的部分将自动为空

说明:对于堆来说,对于堆来说,频繁的新/删除会导致内存空间不连续,导致大量碎片,降低程序效率。 对迭来说,没有这个问题

4 .申请效率

(1)堆栈由系统自动分配,速度快。 程序员无法控制

)堆是由malloc分配的内存,通常速度慢,容易碎片化,但最容易使用。

5 .堆和堆栈中的存储内容

)堆栈)函数调用时,第一个堆栈的主函数中后面的下一个语句的`地址,以及函数的每个参数、参数从右到左堆栈,然后是函数中的局部变量。 注意:静态变量不进入堆栈。

这次函数调用结束后,局部变量先离开堆栈,然后发出参数,最后堆栈的顶部指针指向最初保存的地址,也就是主函数中的下一个指令,程序从这一点开始继续运行。

(2)堆)通常在堆的开头用1字节存储堆的大小。

6 .访问效率

(1)堆: char *s1=”hellow tigerjibo "; 正在编译

是就确定的

(2)栈:char s1[]=”hellow tigerjibo”;是在运行时赋值的;用数组比用指针速度更快一些,指针在底层汇编中需要用edx寄存器中转一下,而数组在栈上读取。

补充:

栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

7.分配方式:

(1)堆都是动态分配的,没有静态分配的堆。

(2)栈有两种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的。它的动态分配是由编译器进行释放,无需手工实现。

【C语言中堆和栈的区别有哪些】相关文章:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。