potete aiutarmi anche a me riguardo lo stesso argomento?

alloco una matrice dinamicamente con dimensioni lette da standard input

quando alloco una matrice 3x3 o superiore mi crasha al momento di inserire gli elementi nell'ultima riga..xche?

se alloco una 2x2 non succede..
codice:
void matrice_dinamica(){
      int i,j,k,z;
      printf("Inserire numero di righe:\n");
      scanf("%d",&i);
      printf("Inserire numero di colonne:\n");
      scanf("%d",&j);
      int** matrix=(int**)malloc(i*sizeof(int*));
      if(!matrix) printf("Spazio insufficiente");
      for(k=0;k<i;k++){
          matrix[i]=(int*)malloc(j*sizeof(int));
          if(!matrix[i]) ("Spazio insufficiente\n");             
      }
      printf("Inserire elementi per rig\n");
      for(k=0;k<i;k++){
          for(z=0;z<j;z++){
              scanf("%d",&matrix[k][z]);
          }
      }
            
      for(k=0;k<i;k++){
          for(z=0;z<j;z++)
             printf("%d ",matrix[k][z]);
          printf("\n");                 
      }
      
      
}

main(){
   matrice_dinamica();
   getch();    
}