段错误一定是数组越界吗??写题的时候啥都没变,就改了定义结构体数组的位置就报错!!求大佬

上题是PTA团体程序设计天梯赛--练习题上的一道题,下面是给的用例

我的代码如下

#include <stdio.h>

typedef struct 
{
    float num;
    float price;
    float avg;
}CAKE;
CAKE cake[1010];
int main()
{
    int N,D;
    
    scanf("%d %d",&N,&D);
    
    for(int i=0;i<N;i++)
    {
        scanf("%f",&cake[i].num);
        
    }
    for(int i=0;i<N;i++)
    {
        scanf("%f",&cake[i].price);
        
    }
    for(int i=0;i<N;i++)
    {
        cake[i].avg=cake[i].price/cake[i].num;
        
        
    }
    for(int i=0;i<N-1;i++)//按单价降序排列
    {
        int k=i;
        for(int j=i+1;j<N;j++)
        {
            if(cake[j].avg>cake[k].avg)
            {
                k=j;
            }
        }
        CAKE temp=cake[k];//交换k和i
        cake[k]=cake[i];
        cake[i]=temp;
    }
    int i=0;
    float get=0;
    while(D)
    {
        
        if(D>=cake[i].num)
        {
            D-=cake[i].num;
            get+=cake[i].price;
            i++;
        }
        else
        {
            
            get+=D*cake[i].avg;
            D=0;
        }
    }
    printf("%.2lf",get);
        
    
}

我的思路就是把单价算出来,然后按单价从高到低排列依次分配数量就行

但是问题出在了定义结构体数组上,你看

 

当我把cake数组定义在main函数外面的时候,答案是这样的

等我移到这里时

答案是这样

但当我移到这个位置时,有趣的事情发生了

其他啥都没动,有没有大佬知道指导!!感激涕零!!