兩種執行緒棧的溢位

2021-10-02 04:50:32 字數 1065 閱讀 5865

第一種情況**很簡單:

x86的cpu頁面大小為4kb,而我們只使用了100*4=400byte的空間(沒有超出預設調撥的儲存器大小(第二個頁面4kb),所以棧不會給下面的頁面再調撥儲存器了)。

而我們的nvalue[10000] = 0;試圖寫入第10000*4 = 40000,也就是試圖網40000+nvalue處寫入資料(在棧的第10個頁面處),這塊記憶體並沒有被調撥物理儲存器,所以會發生記憶體讀取錯誤。

第一種情況理解了,我們來看第二種情況

執行完*pbytes = 0x5;在pbytes記憶體第乙個位元組為0x05,這是沒什麼問題,因為是我們賦值的

但是執行abyte[pbytes-abyte] = 1;這句的時候我們再看記憶體

變成0x01了,為什麼就不用多說了吧,因為我們手動給他接下來的頁面調撥了物理儲存器virtualalloc(paddress, 0x10000, mem_commit | mem_reserve, page_readwrite);自然不會發生棧溢位啦

特此宣告,我是乙個沒什麼分享精神的沙雕,不保證正確,只作為自己學習使用。

棧的兩種實現

順序表實現棧 include include 順序表實現棧 define test head printf n s n function define default sz 5 typedef char datatype typedef struct seqstack seqstack 棧的初始化 ...

棧的兩種實現

棧的基本實現 include stdafx.h include include define maxsize 64 using namespace std 基於陣列實現的棧 class stack 預設建構函式 int push int data 元素入棧 int pop 元素出棧 bool ise...

棧的兩種C 實現

棧 stack 是限制插入和刪除只能在乙個位置上進行的表,該位置是表的末端,叫做棧的頂 top 它是後進先出 lifo 的。對棧的基本操作只有push 進棧 和pop 出棧 兩種,前者相當於插入,後者相當於刪除最後的元素。棧本質上是一種受限制的表,所以可以使用任何一種表的形式來實現它,最常用的是使用...