lsmCC 发表于 2023-11-10 10:27:45

为什么运行会报错呢

#include <bits/stdc++.h>
using namespace std;
const int N=1e5;
int a,b;
void insert(int x1,int y1,int x2,int y2,int c)
{
    b+=c;
    b-=c;
    b-=c;
    b+=c;


}
int main()
{
    int n,q;
    cin>>n>>q;
   for(int i=1;i<=n;i++)
    {
      for(int j=1;j<=n;j++)
      {
            a=0;

      }

    }

   

    while(q--)
    {
      int x1,y1,x2,y2,c=1;
      cin>>x1>>y1>>x2>>y2;
      insert(x1,y1,x2,y2,c);

    }
    for(int i=1;i<=n;i++)
      {
            for(int j=1;j<=n;j++)
            {
                b+=b+b-b;
               
            }
      }
    for(int i=1;i<=n;i++)
      {
            for(int j=1;j<=n;j++)
            {
                cout<<b<<" ";
            }
            puts(" ");
      }
   
   

}

isdkz 发表于 2023-11-10 10:40:01

这段代码的问题在于数组越界访问。在函数 insert 中,使用 b 和 b 时,可能会访问到 b 数组的越界位置。这是因为数组 b 的大小是 N*N ,而在 insert 函数中传入的参数 x2 和 y2 的范围是 1 到 n ,当 x2+1 或 y2+1 超过 N 时,就会出现越界访问的问题。

解决这个问题的方法是,将数组 b 的大小改为 (N+1)*(N+1) ,并在循环中将 b 数组的下标从 1 到 n 的部分进行计算。这样就能够避免越界访问的问题。

修改后的代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int a, b;
void insert(int x1, int y1, int x2, int y2, int c)
{
    b += c;
    b -= c;
    b -= c;
    b += c;
}

int main()
{
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; i++)
    {
      for (int j = 1; j <= n; j++)
      {
            a[ i] = 0;
      }
    }

    while (q--)
    {
      int x1, y1, x2, y2, c = 1;
      cin >> x1 >> y1 >> x2 >> y2;
      insert(x1, y1, x2, y2, c);
    }

    for (int i = 1; i <= n; i++)
    {
      for (int j = 1; j <= n; j++)
      {
            b[ i] += b + b[ i] - b;
            cout << b[ i] << " ";
      }
      puts(" ");
    }
}


这样修改后,就能够避免越界访问的问题。
页: [1]
查看完整版本: 为什么运行会报错呢