作者ericerix (我的帥,在於臉)
看板C_and_CPP
標題[問題] 遞迴呼叫函數發生存取違規!?
時間Fri Jul 24 15:30:16 2020
開發平台(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
才出現存取違規
怎麼會這樣!?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.10.110.55 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1595575818.A.7A5.html
1F:→ firejox: 請貼程式碼,我們沒有水晶球 07/24 15:45
https://ideone.com/juWfu6
學校作業的
※ 編輯: ericerix (101.10.110.55 臺灣), 07/24/2020 15:57:27
2F:→ moebear: 不知道26萬會不會爆 但是太大是會爆的 07/24 16:43
3F:→ moebear: 摁..你多次迴圈應該是爆了吧 你配少一點 07/24 16:44
感謝~我也有想過是不是記憶體配大,但我以為現代的電腦hold的住XDD
※ 編輯: ericerix (101.10.110.55 臺灣), 07/24/2020 17:02:21
4F:→ nh60211as: 沒有,單純是windows編出來的程式預設stack很小 07/24 17:17
5F:→ nh60211as: 先把函式裡的char rule[512][512];改成動態配置 07/24 17:28
6F:推 LPH66: 這個陣列空間如二樓所說的是 26 萬 (256K) 07/24 17:48
7F:→ LPH66: stack 一般不會配太大, 所以這種量的區域變數很快就會爆 07/24 17:48
8F:推 joey11121: 碰觸到kernel memory了吧 07/24 23:42
9F:→ Lipraxde: 樓上的 kernel memory 指的是 kernel space? 07/25 00:26
10F:推 kaneson: 這個參數傳法很有問題吧 07/25 09:38
11F:→ cphe: 跟什麼現代電腦沒關係,先讀點OS吧 07/27 23:21
12F:→ jacky1989: 請愛用動態配置,系統沒這麼多堆疊給你用 07/29 22:40
13F:→ Killercat: user space你寫的在離譜也不可能那麼簡單碰到kernel sp 07/31 11:22
14F:→ Killercat: ace,所有user space的memory都是virtual的 07/31 11:22
15F:→ Killercat: 可以參考一下保護模式的運作原理 07/31 11:23
16F:→ Killercat: kernel memory不可能map給user space app,真有的話那 07/31 11:24
17F:→ Killercat: 就是kernel bug了,可以直接去kernel.org report 07/31 11:24
18F:→ Killercat: 更不會有你隨便寫寫就能碰到kernel memory的事情 07/31 11:26