数组编译错误?帮帮我

Main.c: In function ‘main’:
Main.c:15:5: error: variable-sized object may not be initialized
int a[t][t]= {0};
^~~
Main.c:15:19: warning: excess elements in array initializer
int a[t][t]= {0};
^
Main.c:15:19: note: (near initialization for ‘a[0]’)
Main.c:15:5: warning: excess elements in array initializer
int a[t][t]= {0};
^~~
Main.c:15:5: note: (near initialization for ‘a’)


#include<stdio.h>
#include<math.h>
int main()
{
int n,x,y,oldx=0,oldy,s,t;
scanf("%d",&n);
t=sqrt(n);
int a[t][t]= {0};
oldy=(t-1)/2;
a[oldx][oldy]=1;
for(s=2; s<=n; s++)
{ x=oldx-1;
y=oldy+1;
if(x<0) x=t-1;
if(y>=t) y=0;
if(a[x][y]!=0) x=oldx+1,y=oldy;
a[x][y]=s;
oldx=x;
oldy=y;
}
for(int i=0; i<t; i++)
{ for(int j=0; j<t; j++)
printf("%d\t",a[i][j]);
printf("\n");
}
return 0;
}


#include    <stdio.h>
#include    <math.h>
#include    <stdlib.h>
#include    <string.h>
int main()
{
    int n,x,y,oldx=0,oldy,s,t;
    int **a;
    int i;
    scanf("%d",&n);
    t=sqrt(n);
    //下面的内存申请用的是 n 不是 t 
    a=( int **) malloc( sizeof(int*) * n );
    for(i=0;i<n;i++)    
    {
        a[i]=( int *) malloc( sizeof(int) * n );
        memset(a[i],0,sizeof(int) * n);
    }

    oldy=(t-1)/2;
    a[oldx][oldy]=1;
    for(s=2; s<=n; s++)
    {
        x=oldx-1;
        y=oldy+1;
        if(x<0) x=t-1;
        if(y>=t) y=0;
        if(a[x][y]!=0) x=oldx+1,y=oldy;
        a[x][y]=s;
        oldx=x;
        oldy=y;
    }
    for(int i=0; i<t; i++)
    {
        for(int j=0; j<t; j++) printf("%d\t",a[i][j]);
        printf("\n");
    }

    for(i=0;i<n;i++)
    {
        free(a[i]);
    }
    free(*a);

    return 0;
}

把代码贴出来看看呀

int a[t][t]= {0};
t 不能是变量
比如可以用一个较大的数先声明
int a[100][100]= {0};
后面再用,但是要保证不要越界