gpt4 book ai didi

c++ - 以下程序中的段错误

转载 作者:行者123 更新时间:2023-11-28 01:25:31 57 4
gpt4 key购买 nike

我试图解决非常基本的问题 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;

}

}

最佳答案

您的问题可能是由于 int arr[10001] 的堆栈分配引起的。这很可能是一个 40kB 的分配。现在,“分配”是错误的词,因为它本质上只是通过执行类似 int * arr = STACK_POINTER-40004 的操作来计算 arr 的地址。

不幸的是,默认情况下最大堆栈大小通常为 12 kB。这意味着操作系统将 12 kB 映射到内存并将 STACK_POINTER 设置到该内存的顶部(假设堆栈向下增长)。

因此最终结果是您的 arr 指针现在指向已分配的堆栈之外——进入未分配的内存——并且第一次访问会引发段错误。通常,您可以通过使用 ulimit -s 增加堆栈大小来解决此问题,但您无法控制所使用的判断平台。

你有两个选择:

  • 改用堆分配 int *arr = new int[10001]。这不受初始堆栈大小的影响。在正常的程序中,您应该注意清理它,但对于像这样的短程序,则没有必要。
  • int arr[10001] 的声明移到顶层。 arr 将指向称为 BSS 部分的区域,该区域最初为零。这也不受初始堆栈大小的影响。

关于c++ - 以下程序中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54034725/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com