Moodle运行C++凸包代码出现stack smash错误原因排查
故障诊断与修复方案
核心原因
stack smash错误确实由sscanf使用不当直接导致,具体问题如下:
- 存储输入的字符数组长度严重不足:你定义了
char c[5],但测试输入中的坐标如(35,-10)包含8个可见字符,加上C字符串强制要求的末尾\0结束符,最少需要9字节存储空间。输入时数据直接越界写入栈空间,破坏了栈保护结构,程序退出时栈校验触发就会报stack smash错误。本地运行无报错属于巧合,是未定义行为的典型表现,不代表代码没有问题。 - 附加栈风险点:你使用了C++标准不支持的可变长度数组
Point points[n],这是GCC等编译器的扩展功能,栈上分配变长数组本身也存在栈溢出风险。
修复方案
- 扩容字符数组:将
char c[5]改为char c[20],足够覆盖常规长度的坐标输入,避免sscanf写入越界。 - 替换非标准可变长度数组:将main函数中的
Point points[n];替换为标准C++容器vector<Point> points(n);,同步修改convexHull函数的入参为void convexHull(vector<Point>& points)即可。 - 可选更安全的输入方式:直接用cin匹配输入格式,完全避免sscanf和缓冲区溢出风险:
char left, right, comma; cin >> left >> a >> comma >> b >> right;
额外注意事项
- 你定义的全局数组
arr[20]、arr2[20]长度固定为20,如果输入点数较多导致凸包点数超过20,也会触发数组越界,建议同样替换为vector<int>存储结果。
内容的提问来源于stack exchange,提问作者Restandsleep
相关产品推荐
相关产品推荐

