C++ 分段错误:为什么这里的数组索引超出范围?

C++ 分段错误:为什么这里的数组索引超出范围?,c++,arrays,memory,vector,C++,Arrays,Memory,Vector,我试图在这里解决这个问题,并将数组初始化为0,但当我尝试访问n=4和m=4的arr[0][4]处的值时,它会打印一个垃圾值 我尝试使用向量进行初始化,因为我在数组的初始化中犯了一些错误,它适用于示例测试用例,但仍然存在分段错误 这是我的密码- #include<bits/stdc++.h> #include <iostream> using namespace std; int main() { // your code goes here int t;

我试图在这里解决这个问题,并将数组初始化为0,但当我尝试访问n=4和m=4的arr[0][4]处的值时,它会打印一个垃圾值

我尝试使用向量进行初始化,因为我在数组的初始化中犯了一些错误,它适用于示例测试用例,但仍然存在分段错误

这是我的密码-

#include<bits/stdc++.h>
#include <iostream>
using namespace std;

int main() {
    // your code goes here
    int t;
    cin>>t;
    while(t--){
        long long n,m,k,res=0;
        cin>>n>>m>>k;
        //vector<vector<long long>> arr(n+2,vector<long long>(m+2,0));
        long long arr[n+2][m+2]={0};
        long long vec[k][k];
        for(unsigned int it=0;it<k;it++){
            int t1,t2;
            cin>>t1>>t2;
            arr[t1][t2]=1;
            vec[it][0]=t1;
            vec[it][1]=t2;
        }
        cout<<"values:"<<arr[1][4]<<endl;
        for(unsigned int itr =0;itr<k;itr++){
            int j = vec[itr][0];
            int i = vec[itr][1];
            //cout<<i<<" "<<j<<endl;
            res+=4-(arr[i-1][j]+arr[i+1][j]+arr[i][j-1]+arr[i][j+1]);
        }
        cout<<res<<endl;
    }
    return 0;
}

制约因素:

  1≤T≤10 
  1≤N,M≤10^9
  1≤K≤10^5
  1≤r≤N
  1≤c≤M
  the cells containing plants are pairwise distinct
我希望第一个测试用例的输出是-20,但得到的是垃圾值。

当,它的大小必须是-也就是说,大小必须在编译时已知。编译器应该抱怨这些行,因为
m
n
k
在编译时未初始化(更准确地说,初始化为不确定值):

long long arr[n+2][m+2]={0};
long long vec[k][k];
当,它的大小必须是-也就是说,大小必须在编译时已知。编译器应该抱怨这些行,因为
m
n
k
在编译时未初始化(更准确地说,初始化为不确定值):

long long arr[n+2][m+2]={0};
long long vec[k][k];

我认为数组在arr[I-1][j]或arr[I+1][j]或arr[I][j+1]或arr[I][j-1]中越界,这就是为什么会出现错误。

我认为数组在arr[I-1][j]或arr[I][j]或arr[I][j+1]或arr[I][j-1]中越界这就是错误产生的原因。

由于程序限制,
arr
vec
很容易超出可用的自动内存。可变长度数组的原因之一是不支持标准C++。考虑使用A代替,也不包括<>代码>位/STDC++.H./C>或使用No.StaseSTD使用<代码>,它们是非常糟糕的实践。绝对不要使用
long-long
因为您存储的只是一个布尔值。
#include
真正有趣的地方是
也包括在内。这暗示了一点
bits/stdc++.h
是一个特定于实现的头文件,旨在通过包含整个标准库来帮助预编译头文件。一些人认为这是一种避免包含他们需要包含的内容的方法,因此编译不可移植代码的速度较慢。不是特别好的想法。此外,始终检查用户输入的一致性(例如t1和t2小于k)。@JeJo,问题的限制阻止了这一点。以下是限制条件1≤T≤10 1≤N、 M≤109 1≤K≤105 1≤R≤n1≤C≤M在程序限制下,
arr
vec
很容易超出可用的自动内存。可变长度数组的原因之一是不支持标准C++。考虑使用A代替,也不包括<>代码>位/STDC++.H./C>或使用No.StaseSTD使用<代码>,它们是非常糟糕的实践。绝对不要使用
long-long
因为您存储的只是一个布尔值。
#include
真正有趣的地方是
也包括在内。这暗示了一点
bits/stdc++.h
是一个特定于实现的头文件,旨在通过包含整个标准库来帮助预编译头文件。一些人认为这是一种避免包含他们需要包含的内容的方法,因此编译不可移植代码的速度较慢。不是特别好的想法。此外,始终检查用户输入的一致性(例如t1和t2小于k)。@JeJo,问题的限制阻止了这一点。以下是限制条件1≤T≤10 1≤N、 M≤109 1≤K≤105 1≤R≤n1≤C≤麻省理工学院不会抱怨的<代码>#include在很大程度上确保了g++编译器,而g++允许可变长度数组。由于VLAS,ASK的代码几乎肯定会在堆栈的末尾运行,用于以后的测试用例。我说“应该”,因为VLAS在标准C++中是被禁止的。如前所述,数组大小必须是一个常量表达式(),并且常量表达式必须在编译时()可计算。在编译器允许的情况下,VLA会以六种方式生成坏程序。这个编译器允许它们,当它们超过堆栈空间时,它们几乎肯定是SEGFULTS的原因。你的回答没有解决这个问题。不使用VLA是一项合理的政策,但是为了得到一个好的答案,你应该解释为什么他们在这里是一个问题,并提供一个替代方案。它不会抱怨<代码>#include在很大程度上确保了g++编译器,而g++允许可变长度数组。由于VLAS,ASK的代码几乎肯定会在堆栈的末尾运行,用于以后的测试用例。我说“应该”,因为VLAS在标准C++中是被禁止的。如前所述,数组大小必须是一个常量表达式(),并且常量表达式必须在编译时()可计算。在编译器允许的情况下,VLA会以六种方式生成坏程序。这个编译器允许它们,当它们超过堆栈空间时,它们几乎肯定是SEGFULTS的原因。你的回答没有解决这个问题。不使用VLA是合理的策略,但是为了得到一个好的答案,您应该解释为什么它们在这里是一个问题,并提供一个替代方案。在示例集合中,数组边界没有被打破。数学是错的。asker有多个问题,包括(等等!)堆栈溢出。在示例集合中,未违反数组边界。数学是错的。asker有多个问题,包括(等等!)堆栈溢出。