与任何其他数据结构一样,堆栈是遵循 LIFO(后进先出)原则的数据结构。正如您的问题中提到的,它根据 LIFO 原则进行数据输入和检索的推送和弹出操作。
每个进程基本上由地址空间的 4 部分组成,它们分别是
进程可访问
当它运行时
文本 - 这部分包含实际的 m/c 指令
执行。在许多操作系统上,这被设置为只读,因此
进程不能修改它的指令。这允许多个实例
共享文本的单个副本的程序。
数据 - 这部分包含程序的数据部分。它进一步
分为
1) 初始化只读数据 - 这包含数据元素
由程序初始化,并且它们在运行期间只读
进程的执行。
2) 初始化读写数据 - 这包含数据元素
由程序初始化并在运行过程中被修改
流程执行。
3)未初始化的数据 - 这包含的元素不是
由程序初始化并在进程执行前设置为 0。
这些也可以修改并称为 BSS(块开始符号)。这
这些元素的建议是,系统不必在
该区域的程序文件,b'因为它在操作系统之前被初始化为 0
进程开始执行。
堆栈 - 这部分用于局部变量,堆栈帧
堆 - 这部分包含动态分配的内存
int abc = 1; ----> Initialized Read-Write Data
char *str; ----> BSS
const int i = 10; -----> Initialized Read-Only Data
main()
{
int ii,a=1,b=2,c; -----> Local Variables on
Stack
char *ptr;
ptr = malloc(4); ------> Allocated Memory in Heap
c= a+b; ------> Text
}
数据,存储数据
文字、店铺代码
链接器生成的文件有 3 个(主要?)段/部分。
text - 程序文本(显然是 const char 数组。可能还有其他 'const' 数组,因为无论如何都无法更改)。我不是 100% 确定数组部分,也许
有人会纠正我。
data - 初始化的全局数据。见下面的例子。
bss - 未初始化的全局数据。
下面是一些例子
int x = 1; /* goes into data */
int y; /* goes into bss */
const int z = 1;
这个,我们已经看到进入“文本”,因为无论如何都无法更改,但可以保护
const char array[] = {'a','b'....etc}
/* the rest goes into text */
int main(void)
{
return EXIT_SUCCESS;
}
由符号开始的块
(BSS) Unix 链接器产生的未初始化数据段。其他段是包含程序代码的“文本”段,而“数据”段包含
初始化数据。 bss 段中的对象只有名称和大小,没有值。