作者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/cn.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