【问题标题】:Stack overflow in area calculation面积计算中的堆栈溢出
【发布时间】:2018-06-16 13:40:52
【问题描述】:

我有 N 个按三角顺序定义多边形的点。我已经使用以下代码来计算该多边形的面积,但我得到了堆栈溢出,我无法完全理解为什么。起初我以为是 while 函数越界了,但显然不是?

#include<iostream>
#include<fstream>
using namespace std;

struct punct {
    long double x;
    long double y;
};

int main()
{
    int N;
    long double aria = 0.0f;
    punct v[100000];
    ifstream f("aria.in");
    ofstream g("aria.out");
    f >> N;
    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 = 1 / 2 * aria;

    g << aria;

    f.close();
    g.close();
    return 0;
}

我的输入文件aria.in 有以下内容:

4
-2 -2
2 -2
2 2
-2 2

【问题讨论】:

  • 最后一段代码还在执行吗?调试器告诉你什么?
  • 不要在栈上分配punct v[100000];这样的大数组,因为栈空间比较有限。使用::std::vector在堆上分配它们。
  • 这可能是punct v[100000] 的错。您正在为此数组 16 * 100000 =~ 1.5MB 分配 lots 的堆栈空间。请尝试堆分配。一条线索:use vector
  • @tomix86 我认为 long double 是(通常)每个 10 个字节?另外...回复OP:可以通过命令增加堆栈大小(每个操作系统不同)
  • @user202729 AFAIK 它取决于架构和编译器,long double 应至少 8 字节长,请参阅here。我做了一个快速检查,使用 VS2017 为 x64 编译它确实是 8 个字节。

标签: c++ stack-overflow polygon area


【解决方案1】:

这一行

punct v[100000];

由于堆栈太大而出错

改用std::vector,即

#include <vector>

....

std::vector<punct> v(100000);

另外你应该检查你是否真的打开了文件

【讨论】:

    【解决方案2】:

    您试图在堆栈上 malloc 100000 punct,这会导致堆栈溢出。

    你可以在堆上 malloc 为:

    punct *v = new  punct[100000 + 1];
    

    这应该可以解决堆栈溢出问题。 为了完整起见,最好在不需要后释放内存。

    delete [] v;
    

    你也可以使用c++11新vector

    #include <vector>
    std::vector<punct> v(100000 + 1);
    

    array 容器来做它

    #include <array>
    std::array<punct, 100000 + 1> v;
    

    注意到我在100000 中添加了一个,因为您的代码看起来像是基于 1 的起始索引。但是,c++ 从zero 计算索引。不过,这是您的选择。

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 2012-08-09
      • 2019-05-18
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 2011-01-29
      相关资源
      最近更新 更多