GeeksforGeeks括号校验题栈实现代码编译通过提交报段错误求助
问题原因排查方向
段错误本质是访问了无权访问的内存地址,针对括号校验的栈实现,常见触发原因有以下几个:
- 空栈非法操作:遇到右括号时,没有先判断栈是否为空就直接执行
top()、pop()操作。比如测试用例为"]"、"())"这类右括号数量多于左括号的场景时,栈已经被弹空还继续操作,就会触发未定义行为,大概率出现段错误。你本地测试没触发大概率是用的测试用例都是左括号数量大于等于右括号的情况,刚好没踩中这个边界。 - 手写栈容量不足:如果你没有使用语言内置的栈容器,而是用数组手动模拟栈,很可能是数组开的容量小于题目给定的输入字符串最大长度,超长输入下数组越界访问触发段错误。
- 字符串遍历越界:如果是C/C++实现,遍历字符串时没有正确判断终止边界,访问到字符串末尾之后的内存地址也会触发段错误。
修复建议
- 所有执行栈弹出、取栈顶操作的位置,先加非空判断:如果栈已经为空且当前遇到右括号,直接返回不合法即可,不要继续操作栈。
- 如果是手动实现的栈,将底层数组的容量调整为题目输入最大长度+10的冗余值,避免超长输入越界。
- 自行用极端用例提前验证:包括空字符串、全左括号、全右括号、右括号开头的字符串、最大长度的输入字符串,都跑一遍就能定位问题。
内容的提问来源于stack exchange,提问作者Naman Verma
相关产品推荐
相关产品推荐

