【问题标题】:why got segmentation error in my program?为什么在我的程序中出现分段错误?
【发布时间】:2020-05-24 15:27:55
【问题描述】:

https://www.hackerrank.com/challenges/gridland-metro/problem 这是黑客等级问题的链接。

#include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  int tot = n * m;
  vector<vector<int>> track;

  for (int i = 1; i <= n; i++) {
    track[i][0] = INT_MAX;
    track[i][1] = INT_MIN;
  }

  while (k--) {
    int r, c1, c2;
    scanf("%d%d%d", &r, &c1, &c2);

    if (track[r][0] > c1 && track[r][1] < c2) {
      if (track[r][0] == INT_MAX && track[r][1] == INT_MIN) {
        track[r][0] = c1;
        track[r][1] = c2;
        tot -= c2 - c1 + 1;
      } else {
        tot -= (track[r][0] - c1) + (c2 - track[r][1]);
        track[r][0] = c1;
        track[r][1] = c2;
      }
    } else if (track[r][0] <= c1 && track[r][1] >= c2) {
      tot -= 0;
      continue;
    } else if ((track[r][1] > c1 && track[r][0] < c1) && track[r][1] < c2) {
      c1 = track[r][1] + 1;
      tot -= c2 - c1 + 1;
    }
  }

  printf("%lld", tot);
}

这是我的问题代码,我在这方面遇到了分段错误。 PLz 告诉我执行这个程序的正确方法,因为我猜我的代码是蛮力的,如果它是正确的

【问题讨论】:

  • 您的问题是为什么您不能从随机的hackerrank 或其他在线法官网站学习C++ 的证据。 vector&lt;vector&lt; int&gt;&gt; track; for(int i=1;i&lt;=n;i++) { track[i][0]=INT_MAX; track[i][1]=INT_MIN; } -- 请看那个代码。向量不会自行调整大小。简而言之,hackerrank 和其他网站假设您对所使用的语言有足够的了解,并将他们的问题集中在数据结构、算法和数学技巧上。
  • 对上面的轻微修正:vectors 可以调整自己的大小,但如果您使用[] 运算符则不会。 [] 是为了模仿使用 [] 访问普通旧数组的行为而构建的:具有零错误检查或调整大小等特殊功能的极快访问。 Consult std::vector documentation 了解如何正确使用 vector
  • See the documentation。查看 Modifiers 部分和constructor。您需要构造您的向量,在构造函数参数中为其指定大小,或者通过调用该链接处的修改器函数之一来修改它。

标签: c++ c++11 compiler-errors segmentation-fault c++14


【解决方案1】:

这可能对你有所帮助,但你必须改变你的思维方式:

分段错误的2个原因:

  1. 正如其他人所说,您必须首先分配内存/初始化向量。它会自动不知道要采用什么尺寸。
  2. 在您的问题中,n 的值,m ,如果您分配的内存包含这么多条目,那么它可能至少达到 (500 MB),这是非常大的。李>

1 个可能的超时原因:

  1. 有一个 for 循环从 1 运行到 n,在最坏的情况下可能是 10^9 次。即使您以某种方式设法分配内存,这本身也会超时。 Refer this for timeout issues.

尽管如此,对于你的蛮力方法,你可以试试这个:

#include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  int tot = n * m;
  vector<vector<int>> track(n+1);
  //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  for (int i = 1; i <= n; i++) {
    track[i] = vector<int>(2);
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^
    track[i][0] = INT_MAX;
    track[i][1] = INT_MIN;
  }

  while (k--) {
    int r, c1, c2;
    scanf("%d%d%d", &r, &c1, &c2);

    if (track[r][0] > c1 && track[r][1] < c2) {
      if (track[r][0] == INT_MAX && track[r][1] == INT_MIN) {
        track[r][0] = c1;
        track[r][1] = c2;
        tot -= c2 - c1 + 1;
      } else {
        tot -= (track[r][0] - c1) + (c2 - track[r][1]);
        track[r][0] = c1;
        track[r][1] = c2;
      }
    } else if (track[r][0] <= c1 && track[r][1] >= c2) {
      tot -= 0;
      continue;
    } else if ((track[r][1] > c1 && track[r][0] < c1) && track[r][1] < c2) {
      c1 = track[r][1] + 1;
      tot -= c2 - c1 + 1;
    }
  }

  printf("%lld", tot);
}

【讨论】:

  • 是的,你是对的,我收到了 SIGABRT 错误。会尝试不同的方法。
  • 酷。跟上它。
  • 您好,如果您完成了这个问题,那么也许您可以标记答案,以便其他人也可以看到它,如果他们遇到同样的问题或者如果您想了解更多内容,请告诉。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 2018-01-07
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多