prova questo...

codice:
#include<stdio.h>
#include<stdlib.h>
#define DIM_R 3 //numero righe
#define DIM_C 3 //numero colonne

int * bubble(int a[], int n); //bubble_sort generico
void copy_new(int a[][DIM_C], int app[], int column); //copia un vettore nel colonna column della matrice a

int main(void){
	srand(time(NULL));
	int matrix[DIM_R][DIM_C];
	int i, j, z;
	int *app;

	app=calloc(DIM_R, sizeof(int));
	
	/*INIZIALIZZO LA MATRICE CON NUMERI A CASO E LA STAMPO*/
	for(i=0;i<DIM_R;i++)
        for(j=0;j<DIM_C;j++)
            matrix[i][j]=rand()%DIM_R+1;

 		for(i=0;i<DIM_R;i++){
			printf("\n");
 			for(j=0;j<DIM_C;j++)printf("%d ", matrix[i][j]);		 					   
		}printf("\n\n");
	 /*------------------------------------------*/
			
	for(j=0;j<DIM_C;j++){			   
	for(i=0;i<DIM_R;i++){app[i]=matrix[i][j];} //carico in un vettore temporaneo una colonna
  	     app=bubble(app, DIM_R); //ordino il vettore appena ottenuto
	     copy_new(matrix, app, j); //e lo copio nella colonna j della matrice
	}
		
        /*STAMPO LA MATRICE ORDINATA*/
  	for(z=0;z<DIM_R;z++){
		printf("\n");
	   	for(j=0;j<DIM_C;j++)printf("%d ", matrix[z][j]);		 					   
	 }printf("\n\n");
	 /*--------------------------------*/
					   
	free(app);
	printf("\n");	
	system("pause");
	return 0;
	}

void copy_new(int a[][DIM_C], int app[], int column){
	 int i;
	 for(i=0;i<DIM_R;i++){
	     a[i][column]=app[i];
	 }
}

int * bubble(int a[], int n){
    int i, j, tmp;
    
    for(i=1;i<n;i++){
    for(j=1;j<n-i+1;j++){
                     if(a[j-1]>a[j]){
                                  tmp=a[j-1];
                                  a[j-1]=a[j];
                                  a[j]=tmp;
                                  }
                     }
    }
    return a;
}
cambia le 2 define se vuoi matrici piu grandi