另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈,而是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。
栈是在一列数据中,一块后进先出的地方,在编程中比如1+2+3++100,就可以利用栈来完成;而队列先进先出的地方,比如打印文档就是排队等候,先到的就先得打印一样。
堆栈只是数据存储处理的方式。PLC的数据存储和处理就要利用这个方式进行,把先进的数据在缓存区一级一级的堆栈存储起来,CPU再从缓存区根据先进先出或者先进后出的顺序进行一个一个采样计算。输出也是一样。
1、堆栈段一般是拿来保存局部变量用的,函数调用,中断返回都需要栈的支持。良好的程序员和优美的代码不应该没有堆栈段。
2、解析:因为CPU要使用堆栈,主要是子程序调用call和ret指令,使用堆栈来存储返回地址,调用子程序的时候,后调用的子程序先返回,而且还可能嵌套调用甚至递归调用,所以必须使用先进后出的数据结构stack来实现返回地址的存储。
3、因为CPU要使用堆栈,主要是子程序调用call和ret指令,使用堆栈来存储返回地址,调用子程序的时候,后调用的子程序先返回,而且还可能嵌套调用甚至递归调用,所以必须使用先进后出的数据结构stack来实现返回地址的存储。
4、堆栈段主要用于暂时保存一些数据,不可或缺。操作系统在把应用程序装入内存时,默认分配堆栈段与代码段同段,应用程序可以自行设置自己的堆栈段。
1、栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底。最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
2、栈是一种能够做压栈操作或出栈操作的线性结构,她遵循“FILO(先进后出)”的规律。就是有一定容量的空栈,我压栈数值a,压栈数值b,然后出栈一次就得到b,再出栈一次得到a。
3、栈的功用相当于一个特定的备份空间。。典型用法就是调用子程序时,备份子程序可能改变那些寄存器的值,便于子程序返回主程序的寄存器值的回复。。
4、主要用途:函数调用和返回,数字转字符,表达式求值,走迷宫等等。在CPU内部栈主要是用来进行子程序调用和返回,中断时数据保存和返回。在编程语言中:主要用来进行函数的调用和返回。
C语言中的堆和栈都是一种数据项按序排列的数据结构。栈就像装数据的桶或箱子我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。
您所说的栈,是由操作系统负责管理的一段栈空间,在递归、子程序调用等处应用广泛。这是操作系统的范畴。——并不是在C语言范畴讨论的概念。
栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值。局部变量,任务线程函数之类的是放在(使用)栈里面的,栈利用率高一些。其操作方式类似于数据结构中的栈。
栈,可以看作是一摞卡片,最上面的卡片表示程序的当前作用域,这往往就是当前正在执行的函数。堆,一段完全独立于当前函数或者栈帧的内存区。
栈是一种数据结构,用于存放数据,可以理解为羽毛球筒,羽毛球就是数据,最先放进去的最后才能拿出来。c语言可以用结构体来定义栈,每个元素以指针指向它前面的元素,最前面的元素称为栈顶,它的指针为空。
栈是用来保存数据的,数据形式是先压栈的最后出,最后压栈的最先出栈,就像米缸一样,你先放进去的要最后才能吃,反而最后放进米缸的最先出一样..。
~
#18240631857#
C语言函数调用时栈中内存的变化 - ******
#臧怡# 程序中,一个函数是一个过程,这个过程可以分为包括传入参数、过程代码、返回三部分构成.由于一个函数过程需要用到内部变量、临时变量等,所以需要在进程空间的栈空间分配一段存储片段来存储函数过程中的这些参数,该内存片段即为...
#18240631857#
Java中为什么栈运行 - ******
#臧怡# ava Virtual Machine Stacks,线程私有,生命周期与线程相同,描述的是Java方法执行的内存模型:每一个方法执行的同时都会创建一个栈帧(Stack Frame),由于存储局部变量表、操作数栈、动态链接、方法出口等信息.每一个方法的执行...
#18240631857#
java中堆与栈的区别 - ******
#臧怡# java的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放.堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失.方法中的局部变量使用final修饰后,放在堆中,而不是栈中.
#18240631857#
函数调用过程中栈到底是怎么压入和弹出的 - ******
#臧怡# 调用时:-将断点程序指针压入堆栈-将3,2,1顺序压入堆栈,并指定参数变量指针到堆栈,参数存放位置即为参数变量位置-压栈保存现场-执行函数-弹栈恢复现场-堆栈指针减掉参数占用字节数,舍弃堆栈中的参数-弹栈断点程序指针加上调用语句字节数继续执行
#18240631857#
C语言编译问题 - ******
#臧怡# 1:一般而言C++兼容C,但严格的说C不是C++的子集.例如 int* p = malloc(10 * sizeof(int)); // C语言中正确,C++中不正确 int* p = (int*)malloc(10 * sizeof(int)); // C语言中正确,C++中也正确 2:楼主的2.3问题归根结底你要看一门课:编译原理 ...
#18240631857#
C语言的返回值返回到什么地方了? - ******
#臧怡# 这个是运行时存储空间的问题,在你调用的一个函数的时候.有一个叫做活动记录的概念.以下是活动记录的概念: 一个过程的一次执行所需信息的管理,是通过使用一个所谓活动记录的连续存储块来实现的.在PASCAL和C语言中,我们通常...
#18240631857#
在.NET程序运行过程中,什么是堆,什么是栈 - ******
#臧怡# 栈和堆的区别堆栈空间分配栈(操作系统):由操作系统自动分配释放,存放函数的变量值,局部变量的值等等,其操作方式类似于数据结构中的栈;堆(操作系统):一般由开发者分配释放,若不释放,程序结束时可能会有OS回收,分配方...
#18240631857#
怎么理解“在栈中第一个进栈的是被调用函数下一行的内存地址”? - ******
#臧怡# 函数调用前和调用后系统通用寄存器值会发生变化,尤其是程序指针会随执行程序或函数的不同而发生改变,当函数执行完后需要返回原来的位置继续执行,所以需要通过栈来保存调用前的程序指针. 而调用的开始就是让程序指针转向被调用的代码,在转向之前当然要先保存程序指针,不然怎么回来继续执行?而回来后继续执行哪里?就是你说的“被调用函数下一行的内存地址”啦.(虽然你描述不准确,但意思差不多)
#18240631857#
堆栈是计算机那个层面的概念啊,有点搞不清了 - ******
#臧怡# 我感觉平常说的堆栈有两个层面.第一就是说数据结构里面的堆栈,由于特殊的需要创造了一种先进后出的结构.第二就是程序执行时候的堆栈,比如A过程调用B过程,执行的时候是先把B过程需要的参数压入栈中,再把B过程之后的下一条指令的地址压入栈中以便程序知道B过程执行完之后要返回到哪里,然后执行B过程的第一条指令.B过程从栈中读取传递进来的参数来运算,B过程运行完毕,通过读取保存在栈中的地址返回到A过程中.
#18240631857#
装入和卸载可执行程序必须用到栈么 - ******
#臧怡# 对应用程序来说栈空间是不需要申请的,直接就可以拿来使用,而堆空间,是需要向操作系统申请的对window下面的可执行程序来说局部变量,是在栈上分配的,每一个应用程序在被装入内存的时候,操作系统都会为这个应用程序分配一个栈...