计算排序C代码在提交codechef后给出分段错误,并在我的计算机上正常工作

时间:2012-09-03 17:15:21

标签: c segmentation-fault

我正在做一个简单的计数排序。我已经测试了很多测试用例。在我的计算机上正常工作但在提交代码大师后提出运行时错误:分段错误。有人请帮帮我。我在这里粘贴我的代码

#include <stdio.h>
#include <stdlib.h>
#define i64 long long

int main(){
int n,i,t;
i64 *max=(i64 *)malloc(sizeof(i64)),*diff=(i64 *)malloc(sizeof(i64));
scanf("%d",&t);
while(t--){
    *max=-9999999999;
    *diff=9999999999;
    scanf("%d",&n);
    i64 A[n],B[n];
    for(i=0;i<n;i++){
        scanf("%llu",&A[i]);
        if(*max<A[i])
            *max=A[i];
        B[i]=0;
    }
    i64 k=*max;
    i64 C[k+1];
    int i,j;
    for(i=0;i<=k;i++) {
        C[i]=0;
    }
    for(j=0;j<n;j++){
        C[A[j]]=C[A[j]]+1;
        B[j]=0;
    }

    for(i=1;i<=k;i++) {
        C[i]=C[i]+C[i-1];
    }
    for(j=n-1;j>=0;j--){
        B[C[A[j]]-1]=A[j];
        C[A[j]]=C[A[j]]-1;
    }
    for(i=1;i<n;i++){
        if(*diff>B[i]-B[i-1])
            *diff=B[i]-B[i-1];
    }
    printf("%llu\n",*diff);
}
return 0;
}

1 个答案:

答案 0 :(得分:0)

明显的候选人是

i64 k=*max;
i64 C[k+1];

如果*max很大,则声明一个可能对于堆栈来说太大的数组,在这种情况下,分段错误是典型的结果。如果输入中的任何数字为负数,那么这可能是导致段错误的另一个原因。