多边形面积计算时出现Stack Overflow问题求助
解决你的多边形面积计算栈溢出问题
嘿,我来帮你揪出Stack Overflow的根源,顺便修正代码里的小bug!
核心问题:栈上数组过大导致溢出
你代码里的punct v[100000];是罪魁祸首。程序的栈内存空间非常有限——大多数系统默认栈大小只有1~8MB,而这个数组有10万个punct结构体,每个结构体包含两个long double(每个占8字节),总大小达到1.6MB。如果你的系统栈默认容量小于这个值,直接就会触发栈溢出错误。而且你实际只用到4个点,完全没必要开这么大的数组,属于过度浪费栈空间。
修复方案
方案1:改用动态分配数组
把栈上的数组转移到堆内存上分配,这样就不会占用宝贵的栈空间:
#include<iostream> #include<fstream> using namespace std; struct punct { long double x; long double y; }; int main() { int N; long double aria = 0.0; punct* v = nullptr; // 先初始化指针 ifstream f("aria.in"); ofstream g("aria.out"); f >> N; v = new punct[N + 1]; // 根据实际需要的大小动态分配(1-based索引) for (int i = 1; i <= N; i++) { f >> v[i].x >> v[i].y; } int k = 1; while (k <= N - 1) { aria = aria + (v[k].x * v[k + 1].y - v[k + 1].x * v[k].y); k++; } aria = aria + (v[N].x * v[1].y - v[1].x * v[N].y); aria = 0.5 * aria; // 修正整数除法错误 g << aria; delete[] v; // 释放堆内存,避免泄漏 f.close(); g.close(); return 0; }
方案2:用C++标准容器vector(更推荐)
vector会自动管理堆内存,不用手动释放,安全性更高:
#include<iostream> #include<fstream> #include<vector> // 别忘了添加头文件 using namespace std; struct punct { long double x; long double y; }; int main() { int N; long double aria = 0.0; ifstream f("aria.in"); ofstream g("aria.out"); f >> N; vector<punct> v(N + 1); // 直接初始化需要的大小 for (int i = 1; i <= N; i++) { f >> v[i].x >> v[i].y; } int k = 1; while (k <= N - 1) { aria = aria + (v[k].x * v[k + 1].y - v[k + 1].x * v[k].y); k++; } aria = aria + (v[N].x * v[1].y - v[1].x * v[N].y); aria /= 2.0; // 用浮点数除法修正错误 g << aria; f.close(); g.close(); return 0; }
额外修正:整数除法的逻辑错误
你代码里的aria = 1 / 2 * aria;会导致面积计算错误——1和2都是整数,整数除法会得到0,最终面积会变成0!改成aria = 0.5 * aria;或者aria /= 2.0;就能解决这个问题。
内容的提问来源于stack exchange,提问作者Shury
相关产品推荐
相关产品推荐

