下面程序中的分段错误

时间:2019-01-04 07:31:17

标签: c++

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

        }

    }

1 个答案:

答案 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部分的区域,该区域最初为零。这也不受初始堆栈大小的影响。