当C中的输入太大时,程序崩溃

时间:2016-02-27 03:57:51

标签: c memory-management input

最终,程序会记录它应该运行的次数,然后下一个数字是每次运行中将有多少个数字,最后它会输入输入数字。它将继续取每个数字后的平均值直到结束,然后打印所有平均值中的最高平均值。

实施例。它运行得很好,就像一个样本 2< ---运行次数
10< ----元素数量
10 -----首次运行元素的开始
8
9
15个
12个
2
3
8
7
11 -----首次运行元素结束
3 -----第二次运行的元素数量
3 ----开始
2
1 ----结束

输出出来了 10.800000
3.000000

但是我需要它能够做到大约500,000到1,000,000个元素,当它只做5000~

时会崩溃

我该如何解决这个问题?我不确定哪些部分可能导致问题

#include <stdio.h>
#include <stdlib.h>

double bestAverage(int* array, long int size);

int main(){

    long int i,n,j,k;
    double best;
    //number of cases
    scanf("%ld",&n);
    //process each case
    for(i=0;i<n;i++){

        //number of games played
        scanf("%ld",&k);

        //allocate memory
        int* scores = malloc(sizeof(long int)*k);

        for(j=0;j<k;j++){

            //score for each game played
            scanf("%d", &scores[j]);
        }

        best = bestAverage(scores,k);
        printf("%.6f\n",best);
        free(scores);
    }

return 0;
}

double bestAverage(int* array, long int size){

    long int i;
    long double average,sum = 0.0,highest = 0.0;
    //allocate memory
    double* averages = malloc(sizeof(long int)*size);

    for(i=0.0;i<size;i++){

        //total scores played so far
        sum = sum + array[i];
        average = sum/(i+1.0);
        //store each average
        averages[i] = average;
        //find the highest average of all the averages
        if(averages[i] > highest){
            highest = averages[i];
        }
    free(averages);
    }

return highest;
}

1 个答案:

答案 0 :(得分:2)

bestAverage()中,在第一次迭代中释放了数组averages。在以后的迭代中,您正在访问释放的内存。

您应该稍后移动free(averages)一行。

此外,正如@BLUEPIXY所述,您为scoresaverages分配了错误的尺寸。