C++ 分段错误:为什么这里的数组索引超出范围?
我试图在这里解决这个问题,并将数组初始化为0,但当我尝试访问n=4和m=4的arr[0][4]处的值时,它会打印一个垃圾值 我尝试使用向量进行初始化,因为我在数组的初始化中犯了一些错误,它适用于示例测试用例,但仍然存在分段错误 这是我的密码-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;
#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有多个问题,包括(等等!)堆栈溢出。