【发布时间】:2019-05-30 18:38:25
【问题描述】:
我试图解决非常基本的问题SPOJ CANDY 提交以下解决方案时出现分段错误。 但在 Visual Studio 中它工作正常。 我还通过考虑大小来声明变量(sum as long long int) 因为它可能很大
1) 是不是因为我在while循环中声明了数组; 我应该在 while 循环之外声明该数组,以便对于每个测试用例它都使用相同的数组
2) 每次循环运行时(对于每个测试用例)是否都会创建新数组,是否会导致垃圾收集或编译器会在每个测试用例后自动释放内存(我知道动态内存分配在这种情况下我们必须显式释放内存)你能告诉我我在哪个范围内 应该声明变量吗?
我有上述疑问,因为分段错误与内存访问有关。
#include<iostream>
using namespace std;
int main(){
while(1){
int n;
int arr[10001];
cin>>n;
if(n==-1)
break;
long long int sum=0;
for(int i=0;i<n;i++){
int temp;
cin>>temp;
sum+=temp;
arr[i]=temp;
}
int mean=sum/n;
if((sum%n)!=0){
cout<<-1<<endl;
continue;
}
int count1=0;
for(int i=0;i<n;i++){
if(arr[i]>mean){
count1+=(arr[i]-mean);
}
}
cout<<count1<<endl;
}
}
【问题讨论】:
-
您没有进行任何动态内存分配,而是使用
new。数组应该在while的每次迭代中都是新鲜的。 -
你输入的 n 值是多少?请同时提供您遇到分段错误的其他输入值
-
上一次迭代中的数组会导致垃圾回收还是编译器会处理呢?
-
Sorry@P.W 但它在我的编译器上运行良好,在提交给在线法官 spoj 时出现分段错误
-
您在堆栈上分配了 40KB,这可能是评审平台不允许的。尝试将
arr的声明移至顶层(因此它位于 .bss 部分中)或在主函数顶部使用堆分配 (new int[10001])。
标签: c++