[問題] 遞迴呼叫函數發生存取違規!?

作者: ericerix (Ponwar)   2020-07-24 15:30:16
開發平台(Platform): (Ex: Win10, Linux, ...)
visual studio 2017
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
c
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
stdio.h
stdlib.h
string.h
問題(Question):
發生存取違規
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
char *first(char target[512][512],bool check[],int n)
補充說明(Supplement):
在這個函數當中,有遞迴呼叫自己,
然而並不是無限迴圈,因為輸入的資料不會使他有無限迴圈的存在
而在逐步測試的時候,
在main中第一次call他,可以進去;
進去之後,再call一次還是可以繼續;
而這次再call的時候,就會發生這個問題
https://i.imgur.com/btR6Y86.jpg
發生的程式碼片段就是在執行"char *first(char target[512][512],bool check[],int n)"時
然後跳到
https://i.imgur.com/efwYnOU.jpg
才出現存取違規
怎麼會這樣!?
作者: firejox (Tangent)   2020-07-24 15:45:00
請貼程式碼,我們沒有水晶球
作者: moebear (萌熊)   2020-07-24 16:43:00
不知道26萬會不會爆 但是太大是會爆的摁..你多次迴圈應該是爆了吧 你配少一點
作者: nh60211as   2020-07-24 17:17:00
沒有,單純是windows編出來的程式預設stack很小先把函式裡的char rule[512][512];改成動態配置
作者: LPH66 (-6.2598534e+18f)   2020-07-24 17:48:00
這個陣列空間如二樓所說的是 26 萬 (256K)stack 一般不會配太大, 所以這種量的區域變數很快就會爆
作者: joey11121 (KRjoyz)   2020-07-24 23:42:00
碰觸到kernel memory了吧
作者: Lipraxde (Lipraxde)   2020-07-25 00:26:00
樓上的 kernel memory 指的是 kernel space?
作者: kaneson (Lance)   2020-07-25 09:38:00
這個參數傳法很有問題吧
作者: cphe (魔鬼藏在垃圾筒裡)   2020-07-27 23:21:00
跟什麼現代電腦沒關係,先讀點OS吧
作者: jacky1989   2020-07-29 22:40:00
請愛用動態配置,系統沒這麼多堆疊給你用
作者: Killercat (殺人貓™)   2020-07-31 11:22:00
user space你寫的在離譜也不可能那麼簡單碰到kernel space,所有user space的memory都是virtual的可以參考一下保護模式的運作原理kernel memory不可能map給user space app,真有的話那就是kernel bug了,可以直接去kernel.org report更不會有你隨便寫寫就能碰到kernel memory的事情

Links booklink

Contact Us: admin [ a t ] ucptt.com