【问题标题】:Why does this code gives out of bounds error?为什么这段代码会出现越界错误?
【发布时间】:2020-07-26 02:56:39
【问题描述】:

我一直试图理解以下代码的越界错误,但我无法弄清楚。原来的问题是 https://codeforces.com/contest/148/problem/A 。我不知道为什么我被卡住了,你能告诉我如何避免类似类型的错误。

  #include <iostream>
  using namespace std;
  int main()
  {
    std::ios::sync_with_stdio(false);
    int k,l,m,n,d,count=0;

    cin>>k>>l>>m>>n>>d;
    int arr[d]={0}; 

    for (int i = 0; i < d; ++i){
      int k1=k*(i+1); k1--;
      int l1=l*(i+1); l1--;
      int m1=m*(i+1); m1--;
      int n1=n*(i+1); n1--;

      if(arr[k1]==0 && k1<d){
        arr[k1]=1; count++;
      }
      if(arr[l1]==0 && l1<d){
        arr[l1]=1; count++;
      }
      if(arr[m1]==0 && m1<d){
        arr[m1]=1; count++;
      }
      if(arr[n1]==0 && n1<d){
        arr[n1]=1; count++;
      }

    }

    cout<<count;


    return 0;
  }

【问题讨论】:

  • if(arr[k1]==0 &amp;&amp; k1&lt;d) 如果是k1 &gt;= d,那么您已经越界访问了数组之后再检查是否为时已晚。
  • int arr[d]={0} -- 这不是有效的 C++。使用std::vector&lt;int&gt; arr(d);
  • @PaulMcKenzie 使用向量arr(d,0);也报错
  • 现在您已更改为矢量,使用at() 而不是[ ] 来访问元素。然后它会指出问题发生的位置,因为会抛出std::out_of_range 异常。
  • @PaulMcKenzie 我使用了 vector.at() 但错误是我写的条件错误,正如 IgorTandetnik 指出的那样

标签: c++ arrays stl c++14 c++17


【解决方案1】:

你需要先检查边界,在:

if(arr[k1]==0 && k1<d)

与:

if(k1<d && arr[k1]==0)

如果第一个条件为假,则不会测试第二个条件。但对应的不是真的。第一个条件总是会被测试。

【讨论】:

  • 现在,请尝试删除您的 VLA 使用,使用 std:: 向量,如果您打算使用 push_back 来增长它们,请使用储备。
猜你喜欢
  • 2021-11-17
  • 2010-10-19
  • 2019-08-26
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多