【问题标题】:Array assignment causes segmentation fault数组分配导致分段错误
【发布时间】:2021-03-13 08:05:54
【问题描述】:

我正在尝试创建一个程序,我可以在其中跟踪所有先前元素的总和。下面是我写的代码。它因信号 11 崩溃,分段错误。

我尝试调试并找到原因。事实证明它在输入之前有效,但是当我尝试将 sum 分配给 sum 数组时,它会抛出错误。

#include<stdio.h>
int main()
{
    long long int n,q,l,r,i,prev=0,temp;
    long long int a[1000000], s[1000000];
    scanf("%lld%lld",&n,&q);
    for(i=0;i<n;i++)
    {
        scanf("%lld",&temp);
        a[i]=temp;
        printf("%lld",a[i]);
        s[i]=a[i]+prev;
        prev= s[i];
    }
}

【问题讨论】:

  • 问题更可能是您的阵列使用了太多内存,总共 16 MB。默认情况下,Linux 进程仅获得 8 MiB 的堆栈。
  • @Someprogrammerdude 是的,你是对的。我降低了初始大小,它可以工作。

标签: arrays c


【解决方案1】:

上述程序中分段错误的唯一可能原因:

  1. “n”变量的第一个输入大于 1000000。

在评估表达式 a[I] 时,您将在 s[I] = a[I] + prev 语句处得到错误异常.....

【讨论】:

    【解决方案2】:

    看来这些自动存储时长的数组声明需要很多内存

    long long int a[1000000], s[1000000];
    

    在main函数之前声明数组。

    long long int a[1000000], s[1000000];
    
    int main()
    {
        long long int n,q,l,r,i,prev=0,temp;
        //...
    

    注意这些变量qlr没有在你的程序中使用。

    【讨论】:

      【解决方案3】:

      另一种方法是为数组动态分配内存

      #include<stdio.h>
      #include <stdlib.h>
      int main()
      {
          long long int n,q,l,r,i,prev=0,temp;
          long long int *a, *s;
          scanf("%lld%lld",&n,&q);
          a = malloc(sizeof(int)*n);
          s = malloc(sizeof(int)*n);
          for(i=0;i<n;i++)
          {
              scanf("%lld",&temp);
              a[i]=temp;
              printf("%lld",a[i]);
              s[i]=a[i]+prev;
              prev= s[i];
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-06-20
        • 1970-01-01
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        • 2021-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多