【问题标题】:Segmentation fault in below program以下程序中的分段错误
【发布时间】: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++


【解决方案1】:

您的问题可能是由于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 部分的区域,该区域最初为零。这也不受初始堆栈大小的影响。

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 2018-09-22
    • 1970-01-01
    • 2020-04-27
    • 2013-02-16
    • 2017-08-23
    • 2018-11-19
    • 2018-04-25
    相关资源
    最近更新 更多