创建大于100000的数组时出现段错误

时间:2019-08-10 21:25:18

标签: c segmentation-fault

如何解决此代码?我不能为n输入超过100000的值,但是我已将其声明为long long int

我试图解决它,但是没有解决。请告诉我怎么了。

#include<stdio.h>

void main() {
    long int n;
    scanf("%ld",&n);
    unsigned long long int a[n];
    unsigned long long int max[n];
    for(unsigned long long int i=0;i<n;i++) {
        scanf("%lld",&a[i]);
    }
    for(unsigned long long int i=0;i<n;i++) {
        unsigned long long int count=0;
        for(unsigned long long int j=0;j<n;j++) {
            if(a[i]==a[j]) {
                count++;
            }
        }
        max[i]=count;
    }

    for(unsigned long long int i=1;i<n;i++) {
        if(max[0]<max[i]) {
            max[0]=max[i];
            a[0]=a[i];
        }
        else if(max[0]==max[i]) {
            if(a[0]>a[i]) {
                a[0]=a[i];
            }
        }
    }
    printf("%lld",a[0]);
}

1 个答案:

答案 0 :(得分:3)

您要在堆栈上声明太大的变量:

unsigned long long int a[n];
unsigned long long int max[n];

这些变量在函数main中声明为局部变量,这意味着在大多数实现中,它们都位于堆栈中。堆栈通常没有那么大,因此当您为n指定较大的值时,它会在堆栈上创建太大的数组,从而导致堆栈溢出并导致段错误。

不是在堆栈上创建数组,而是使用malloc在堆上创建它们:

unsigned long long int *a = malloc(n * sizeof(*a));
unsigned long long int *max = malloc(n * sizeof(*a));

此外,请确保检查malloc的返回值并在完成后调用free