/**< 2014年04月26日 */
/**< 兩個棧共用乙個緩衝區 */
// 儲存格式
// <- base2
// top2 ->
//
//
//
// top1 ->
// <- base1
#include #include #include #include typedef int element_t;
/**< 兩個棧的資料結構 */
typedef struct tag_stack_t
*stack_t;
/**< 初始化,分配記憶體,賦初值 */
void stack_init(stack_t& stack, int size)
/**< 清空指定的棧,讓棧頂等於棧底即可 */
void stack_clear(stack_t& stack, int n)
else if (2 == n)
}/**< 銷毀棧,釋放記憶體 */
void stack_destroy(stack_t& stack)
/**< 判斷是否為空,判斷棧頂和棧底是否相等 */
bool stack_is_empty(stack_t& stack, int n)
return stack->top2 == stack->base2;
}/**< 判斷是否已滿,棧1的位址是向上增加的,棧2的位址是向下減的 */
/**< 若棧1的裡面再放進去乙個後,和棧2的棧頂相等,則已滿 */
bool stack_is_full(stack_t& stack)
/**< 獲取大小,用位址偏移量除以元素的大小即可 */
int stack_size(stack_t& stack, int n)
/**< 棧2的棧頂是遞減的 */
return (stack->base2 - stack->top2) / sizeof(element_t);
}/**< 向指定的棧放入乙個元素 */
bool stack_push(stack_t& stack, element_t e, int n)
if (1 == n)
else
return true;
}/**< 從指定的棧中取出乙個元素 */
bool stack_pop(stack_t& stack, element_t& e, int n)
if (1 == n)
else
return true;
}/**< 遍歷輸出 */
void print(stack_t& stack)
printf("%40s|", buffer);
/**< 輸出棧2 */
n = 0;
buffer[0] = '\0';
for (p = stack->top2+1; p <= stack->base2; ++p)
printf("%-40s\n", buffer);
}/**< 測試程式 */
void stack_test()
int main()
緩衝區溢位 棧
正義與 共存,推動正義的進步,正義迫使 的昇華,兩者誰是誰非。是非只是它人的定義,兩者都是正確的 在我們除錯程式的時候,我們如何去掉除錯視窗中的cccc 的內容。第一步 開啟專案屬性 c c 生成 基本執行時檢查設定為 未初始化的變數 安全檢查 否 第二步 開啟專案屬性 聯結器 高階 隨機基址為 否...
緩衝區溢位 棧溢位
1 緩衝區概念 緩衝區 buffer 又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。使用緩衝區有兩個好處 1 減少實際物理讀寫次數 2 緩衝區在建立時就被分配記憶體,這塊記憶體區域一直被重用,可以...
Kali 棧緩衝區溢位
堆疊記憶體是執行時實時分配的 與棧溢位有關的暫存器主要是esp,ebp,eip。esp和ebp都是用於控制當前執行函式棧幀的暫存器。ebp指向棧幀最高記憶體位址,esp指向棧幀最低記憶體位址。棧幀 棧幀中存放著函式的引數,區域性變數,及恢復前乙個棧幀所需要的資料。一旦函式執行完畢,整個棧幀就會被復原...