关于c语言中堆、栈认识的汇总(参考论坛回帖)

1.堆是是不连续的内存区域,栈是是一块连续的内存的区域(有待考证)

2.为什么c语言在执行工作时程序将使用一个运行时堆栈在中国一些老师或一些低劣质量的书,喜欢把栈叫堆栈。其实堆,栈是栈。c语言在执行工作时程序将使用一个运行时堆栈,其实C语言是基于过程的语言,又叫基于函数的语言。而函数的调用过程用栈又非常的合适。所以,伴随程序的运行,函数的调用都默认给一个栈,基本上是一个线程就有一个调用栈。C++,C#,JAVA,都一个道理。

3.要在函数B里面调用函数A应该怎么做?是不是应该先将B的当前状态保存下来,然后再将A的数据装进来,等A处理完了以后,再将A的数据清除,最后将B的状态恢复...其实这个过程就是一个栈的结构,先将压栈的顺序是 B的状态->A的数据,出栈顺序相反 A的数据->B的状态。这不就和上面的处理过程一致吗?当然,你使用其他的方法也是可以的,但是栈的操作要简单许多,压栈和出栈只需要移动头指针就可以了。

4.学过汇编语言吗?如果学过的话就很好解释啦,不过也没事,其实你问的问题是涉及到C的底层工作机制的,C的底层就是汇编,我们举一个例子,pirntf("%d %d",a,b);这个函数的实现机制是什么呢?首先这个函数有三个参数,在执行此函数时,会将此函数的三个参数压入栈中(sp指针会一直指向栈顶元素的),那么函数就会对这些数据进行处理(因为就在栈中,很容易找到数据的位置,这些不是你做的,是编译器替你完成的),如果函数调用完成,则sp就会恢复到函数调用前的位置,也就是我们说的数据被释放啦,其他函数也是如此。比如:
int add(int x,int y)
{
  int z;
  z = x + y;
  return z;
}

只是在栈中又开辟了z的空间,函数调用后会自动释放的。这就是我们经常说的局部变量,如果想深入理解他的汇编级是怎么实现的,请用command下debug -u 进行反汇编,找到汇编代码仔细研究。堆就是函数动态分配的空间,比如malloc();分配的空间都是在堆里面,我所讲的都是在DOS下,windows下会稍微复杂一些,基本原理都一样。

5.简单点,为什么需要栈? 栈是一种数据结构,无论是程序还是计算机内部,都大量地用到栈这种数据结构。如函数的调用,需要用栈来维护,这样使得程序运行更容易维护,更加效率。堆,最大的特点就是在程序运行时可动态申请内存

6.LZ只的是调用栈吧,它是用来描述函数之间的调用关系的,调用栈有stack frame组成,每一个stack frame对应着一个为运行完的函数

7.堆 heap 栈 stack  堆栈这种说法是不严格的,尽量别用这种说法。
为什么要用堆栈?这样可以更好的利用内存空间。(之前的内存是非常的宝贵的) 栈可以帮助程序员管理一小部分的内存(局部变量等退出函数后就销毁了)。而堆即是供程序员支配管理的。这样就很灵活了,又不会令程序员太累,又给程序员发挥的空间。而且两者增长方向刚好相反,栈是从高地址到低地址,堆是从低地址到高地址。这样空间利用的很充分。
8.C语言的局部变量和参数传递都需要大量使用堆栈。在一个程序顺序中,大函数调用小函数需要向栈压入其所需要的参数,所以就要改变堆栈内容。多线程的程序运行期间不同的线程中其所使用的内存数据也不相同,如果还使用同一个栈的话,那么参数势必会发生混乱,如果使用静态堆栈,那么所有的代码都需要基于一个固定的地址来做堆栈操作,函数中想使用堆栈就全部需要按绝对地址定位,这样非常非常不方便。
对于多线程来说,每一个线程都需要一个栈,所以堆栈是创建线程的时候动态分配的。单线程进程与多线程进程并没有本质的区别,它们都是一个进程中包含1~N个线程的形式,所以单线程进程的堆栈也是在创建该进程的主线程时是为其主线程分配的。
程序中使用栈结构是因为它可以很方便地管理一个模块内所需要使用的内存。在堆栈平衡原则的约束下,一个顺序执行中各个模块在执行的时候都拥有一个堆栈空间,当它运行完毕后只要将esp掉正回调用它时的那个样子那么它对调用者就不会有任何破坏左右。程序调用的时候,因为执行完被调用的函数必须得将调用前的ip寄存器地址缓存下来才可以恢复。这些必要的临时数据都需要一个数据结构将它们保存起来而且也需要快速方便地找到。对于这种需要,老外们研究出了这种栈结构。

因为保护模式下的windows是不允许使用野生内存的,所以程序在内存中除了文件的映射以外其它所需要的内存都是以堆或栈的形式提供出来,所以堆栈就是程序中所有动态数据所使用的内存。堆和栈各是一种数据结构,也有人喜欢把栈叫做堆栈。

9.这个看linux内核原理就知道了,linux可运行的程序叫ELF格式,他规定了各个区域包括大家知道的 全局变量区,BSS区,代码区,等等,当然了,堆的使用也linux操作系统也是相关的,在设计OS的时候,就考虑到进程需要动态获得内存了。而栈个人感觉是C语言自己设计的,也就是说编译器自己安排的。这个观点可以见C专家编程,有一章讲述这个问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值