You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moodle运行C++凸包代码出现stack smash错误原因排查

故障诊断与修复方案

核心原因

stack smash错误确实由sscanf使用不当直接导致,具体问题如下:

  • 存储输入的字符数组长度严重不足:你定义了char c[5],但测试输入中的坐标如(35,-10)包含8个可见字符,加上C字符串强制要求的末尾\0结束符,最少需要9字节存储空间。输入时数据直接越界写入栈空间,破坏了栈保护结构,程序退出时栈校验触发就会报stack smash错误。本地运行无报错属于巧合,是未定义行为的典型表现,不代表代码没有问题。
  • 附加栈风险点:你使用了C++标准不支持的可变长度数组Point points[n],这是GCC等编译器的扩展功能,栈上分配变长数组本身也存在栈溢出风险。

修复方案

  1. 扩容字符数组:将char c[5]改为char c[20],足够覆盖常规长度的坐标输入,避免sscanf写入越界。
  2. 替换非标准可变长度数组:将main函数中的Point points[n];替换为标准C++容器vector<Point> points(n);,同步修改convexHull函数的入参为void convexHull(vector<Point>& points)即可。
  3. 可选更安全的输入方式:直接用cin匹配输入格式,完全避免sscanf和缓冲区溢出风险:
char left, right, comma;
cin >> left >> a >> comma >> b >> right;

额外注意事项

  • 你定义的全局数组arr[20]、arr2[20]长度固定为20,如果输入点数较多导致凸包点数超过20,也会触发数组越界,建议同样替换为vector<int>存储结果。

内容的提问来源于stack exchange,提问作者Restandsleep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:57:03