二维数组排序,出现了乱码

#include<stdio.h>
#include<stdlib.h>
int main(){
    int **a,n,m,i,j,t=0,*p;
    scanf("%d %d",&n,&m);
    a=(int**)malloc(sizeof(int*)*n);
    for(i=0;i<n;i++){
        a[i]=(int*)malloc(sizeof(int)*m);
    }

    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    p=&a[0][0];
    
    //选择排序 
    for(i=0;i<m*n;i++){
        for(j=i;j<m*n;j++){
            if(*(p+i)>*(p+j)){
                t=*(p+i);
                *(p+i)=*(p+j);
                *(p+j)=t;
            }    
        }
    }

    //使每行(最后一行除外)最后只有换行符 
        for(i=0;i<n;i++){
                for(j=0;j<m;j++){
                    if(j==m-1){
                        printf("%d",a[i][j]) ;
                        if(i!=n-1){
                            printf("\n");
                        }
                    }
                    else{printf("%d ",a[i][j]);
                    }
                }
                }
        
    
    return 0;
}

有时会出现乱码(但是也有正常的,虽然没有完成排序)
3 5
2 5 4 332 2
32 34 4 3 3
24 5 3 2 5
-887674243 2 2 4 4
1551069797 1702130553 1986622020 3 3
24 5 3 2 5
数组在内存不是线性排列的吗,我用指针为什么无法完成排序呢
之后我把二维数组转成一维,用同样的指针操作,可以完成排序


#include<stdio.h>
#include<stdlib.h>
int main(){
    int **a,n,m,i,j,t=0,*p,arr[100];
    scanf("%d %d",&n,&m);
    a=(int**)malloc(sizeof(int*)*n);
    for(i=0;i<n;i++){
        a[i]=(int*)malloc(sizeof(int)*m);
    }

    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    int k=0;
         for (i=0; i<n; i++)
        {
            for (j=0; j<m; j++)
              {
                   arr[k] = a[i][j];
                   k++;
              }
         }
        
    p=&arr[0];
    for(i=0;i<m*n;i++){
        for(j=i+1;j<m*n;j++){
            if(*(p+i)>*(p+j)){
                t=*(p+i);
                *(p+i)=*(p+j);
                *(p+j)=t;
            }    
        }
    }
    k=0;

        for (i=0; i<n; i++)
            {
                for (j=0; j<m; j++)
                  {
                    a[i][j]=arr[k];
                       k++;
                  }
             }
        for(i=0;i<n;i++){
                for(j=0;j<m;j++){
                    if(j==m-1){
                        printf("%d",a[i][j]) ;
                        if(i!=n-1){
                            printf("\n");
                        }
                    }
                    else{printf("%d ",a[i][j]);
                    }
                }
                }
        
    
    return 0;
}