My code manage to build without errors, but it crashes when I try to run it. Anybody can give me some help?

Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <malloc.h>

void rubikdesign(int **rubikm);
void switchrowncolumn(int **rubikm, int r);
void rotateupperleft(int **rubikm);
void rotatelowerleft(int **rubikm);
void rotatemidclock(int **rubikm);
void rotatemidanticlock(int **rubikm);
void complete(int **rubikcc);


int main(void)
{
	int i,j, **rubik, **rubikc, n;
	char choice, mode;
	
	rubikdesign(rubik);
	complete(rubikc);
	
	for(i=0; i<2; i++)
	{
		for(j=0; j<4; j++)
		{
			printf("%d", rubik[i][j]);
		}
		printf("\n");
	}
	
	printf("Select the mode of solution:\n\n");
	printf("1. Manual Mode\n");
	printf("2. Automated Mode\n\n");
	printf("Enter your selection: ");
	scanf("%c", &mode);
	
	if(mode == '1')
	{  	 
		do
    	{
			for(i=0; i<2; i++)
			{
				for(j=0; j<4; j++)
				{
					printf("%d", rubik[i][j]);
				}
				printf("\n");
			}
			printf("Manual Mode\n");
			printf("Transform Operations\n");
		
			printf("n0 = Switch rows for the nth column from the left, where n = 1,2,3,4\n");
			printf(" 7 = Rotate Upper row left one step\n");
			printf(" 1 = Rotate Lower row left one step\n");
			printf(" 2 = Rotate the mid four 'squares/numbers' Clockwise one step\n");
			printf(" 8 = Rotate the mid four 'squares/numbers' Anti-Clockwise one step\n");
	        
			printf("Enter Transform Operation (one at a time): ");
			scanf("%c", &choice);
        
			switch (choice)
        	{
        		case  'n':
					printf("Enter column that will switch rows(n=1,2,3,4): ");
					scanf("%d", &n);
           			switchrowncolumn(rubik, n);
        		break;
        		case  '7':
         		    rotateupperleft(rubik);
       			break;
        		case  '1':
            		rotatelowerleft(rubik);
        		break;
        		case  '2':
            		rotatemidclock(rubik);
       			break;
       			case '8':
            		rotatemidanticlock(rubik);
        		break;
        		default:
            		printf("Invalid choice\n");
        		break;
        	}
    	} while(**rubik != (**rubikc));
	}
	
	else if(mode == '2')
	{
		return 0;
	}
	
	/*Free memory for each row*/
	for(i=0;i<2;i++)
	{
		free(rubik[i]);
	}
		
	free(rubik);
	
	return 0;	 
}

void rubikdesign(int **rubikm)
{
	int i;

	/*Memory allocation for row*/
	rubikm = (int**)malloc(2*sizeof(int*));
		
	/*Memory allocation for coloumn*/
	for(i=0; i < 4; i++)
	{
		rubikm[i] = (int*)malloc(4*sizeof(int));
	}
		
	rubikm[0][0] = 4;
	rubikm[0][1] = 7;
	rubikm[0][2] = 1;
	rubikm[0][3] = 6;
	rubikm[1][0] = 2;
	rubikm[1][1] = 3;
	rubikm[1][2] = 8;
	rubikm[1][3] = 5;
		
}

void switchrowncolumn(int **rubikm, int r)
{
	int temp;
	
	temp = rubikm[0][r];
	rubikm[0][r] = rubikm[1][r];
	rubikm[1][r] = temp;
}

void rotateupperleft(int **rubikm)
{
	int temp;
	
	temp = rubikm[0][0];
	rubikm[0][0] = rubikm[0][1];
	rubikm[0][1] = rubikm[0][2];
	rubikm[0][2] = rubikm[0][3];
	rubikm[0][3] = temp;

}

void rotatelowerleft(int **rubikm)
{
	int temp;
	
	temp = rubikm[1][0];
	rubikm[1][0] = rubikm[1][1];
	rubikm[1][1] = rubikm[1][2];
	rubikm[1][2] = rubikm[1][3];
	rubikm[1][3] = temp;
}

void rotatemidclock(int **rubikm)
{
	int temp;
	
	temp = rubikm[0][1];
	rubikm[0][1] = rubikm[1][1];
	rubikm[1][1] = rubikm[1][2];
	rubikm[1][2] = rubikm[0][2];
	rubikm[0][2] = temp;

}

void rotatemidanticlock(int **rubikm)
{
	int temp;
	
	temp = rubikm[0][1];
	rubikm[0][1] = rubikm[0][2];
	rubikm[0][2] = rubikm[1][2];
	rubikm[1][2] = rubikm[1][1];
	rubikm[1][1] = temp;
}


void complete(int **rubikcc)
{
	rubikcc[0][0] = 1;
	rubikcc[0][1] = 2;
	rubikcc[0][2] = 3;
	rubikcc[0][3] = 4;
	rubikcc[1][0] = 5;
	rubikcc[1][1] = 6;
	rubikcc[1][2] = 7;
	rubikcc[1][3] = 8;
}