我正在尝试解决非常基本的问题SPOJ CANDY 提交以下解决方案时出现细分错误。 但是在Visual Studio中可以正常工作。 我还考虑了大小(长为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;
}
}
答案 0 :(得分:2)
您的问题可能是由于#define struct_macro(struct_type_name,struct_name) \
typedef struct struct_type_name \
{ \
int a; \
char b; \
} (struct_name)
的堆栈分配。这很可能是40kB的分配。现在,“分配”一词是错误的,因为它实际上只是通过执行类似int arr[10001]
的操作来计算arr
的地址。
不幸的是,通常默认情况下最大堆栈大小为12 kB。这意味着操作系统将12 kB映射到内存并将int * arr = STACK_POINTER-40004
设置到该内存的顶部(假设堆栈向下增长)。
因此,最终的结果是您的STACK_POINTER
指针现在指向已分配的堆栈之外-指向未分配的内存-并且第一次访问会引发分段错误。通常,您可以通过使用arr
增加堆栈大小来解决此问题,但是您无法控制使用的判断平台。
您有两个选择:
ulimit -s
。这不受初始堆栈大小的影响。在正常程序中,您应注意清理该程序,但对于这样的简短程序,则没有必要。int *arr = new int[10001]
的声明移到顶层。 int arr[10001]
将指向一个称为BSS部分的区域,该区域最初为零。这也不受初始堆栈大小的影响。