Alocação dinâmica de matriz

Ola pessoal, estou fazendo um exercicio em c onde recebo do usuario a quantidade de linhas e colunas para criar uma matriz usando alocação dinamica. Porém quando eu vou passar os valores para a matriz da erro e não sei o que é, ja revisei todo o código e comparei com outros exemplos mas não achei o erro.

#include<stdio.h>
#include<stdlib.h>

int **criaMatriz(int lin, int col);
int recebeMatriz(int lin, int col, int **p);
int recebeFaixa(int lin, int col);
main(){
	int i,lin, col, tam,**p,resp=1;
	while(resp==1){
		
		printf("Informe a quantidade de Linhas: \n");
		scanf("%i",&lin);
		printf("Informe a quantidade de Colunas: \n");
		scanf("%i",&col);
		p = criaMatriz(lin, col);
		recebeMatriz(lin, col, p);
		recebeFaixa(lin,col);
	
		for(i=0;i<lin*col;i++){
			free(p[i]);
		}
		printf("1 para continuar e 0 para sair");
		scanf("%i",&resp);
	}
	

}


int **criaMatriz(int lin, int col){
	int i,**p;
	
	p = (int**)malloc(sizeof(int*)*lin);
	if(!p){
		printf("**Memoria insuficiente**");
	}
	for(i=0;i<lin;i++){
		p[i]=(int*)malloc(sizeof(int*)*col);
	}
	if(!p){
		printf("**Memoria insuficiente**");
	}
		
}

int recebeMatriz(int lin, int col, int **p){
	int i, j, num,pos=0;
	
	for(i=0;i<lin;i++){
		for(j=0;j<col;j++){
			pos=0;
			while(pos==0){
				printf("Digite um numero positivo: \n");
				scanf("%i",&num);
				if(num>=0){
					pos=1;
					p[i][j]=num;
					printf("testa b");
				}else{
					printf("Somente positivos!\n");
				}
			}
			
		}
	}
	
}

int recebeFaixa(int lin, int col){
	int i, j,qtd=0,inicio, fim,tam;
	tam = lin*col;
	
	printf("informe o Inicio da faixa de 1 a %i: \n",tam);
	scanf("%i",&inicio);
	
	printf("informe o Fim da faixa de %i a %i: \n",inicio,tam);
	scanf("%i",&inicio);
	
	for(i=0;i<inicio;i++){
		for(j=0;j<fim;j++){
			qtd+=1;
		}
	}
	
	printf("Quantidade entre %i e %i: %i\n",inicio, fim, qtd);
}