堆棧以及堆和棧的區別
堆棧:堆棧是一個"后進先出"的主存區域,位于堆棧段中,使用SS段寄存器記錄其段地址。它只有一個出入口,即當前棧頂,棧頂是地址較小 的一端(低端),它用堆棧指針寄存器SP指定。堆棧有兩種以字為單位的基本操作,對應兩條基本指令:進棧指令PUSH和出棧指令POP。
堆和棧的區別
一、預備知識—程序的內存分配
一個由C/C++編譯的程序占用的內存分為以下幾個部分
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
2、堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表。
3、全局區(靜態區)(static)— 全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束后由系統釋放。
4、文字常量區 — 常量字符串就是放在這里的,程序結束后由系統釋放 。
5、程序代碼區 — 存放函數體的二進制代碼。
二、例子程序
這是一個前輩寫的,非常詳細
//main.cpp
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = "abc"; 棧
char *p2; 棧
char *p3 = "123456"; 123456