Salve, premetto che sono alle primissime armi con la programmazione, quindi in modo da imparare qualcosa vorrei chiedervi perché questo programma mi da segmentation fault 
codice:
#include <stdio.h>
#include <stdlib.h>
int prodottoScalare(int*,int,);
int main()
{
int i=0,t=0,j,N=0,*arr,**matrix;
do
{scanf("%d",&t);
if (t==0||t==1)
{arr[i]=t;i++;N+=1;}}
while(t!=-1); //inserisco i valori dell'array che devono essere o 0 o 1, -1 interrompe l'inserimento.
**matrix=prodottoScalare(arr,N,); //passo la matrice creata
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
{printf("%d ",matrix[i][j]);}
printf("\n");} //scorro la matrice per stamparla riga per riga
return 0;
}
int prodottoScalare(int *arrx,int M)
{
int **matrixx,i,j;
matrixx=malloc(M*sizeof(int*));
for(i=0;i<M;i++) matrixx[i]=malloc(M*sizeof(int));
for(i=0;i<M;i++)
for(j=0;j<M;j++)
matrixx[i][j]=arrx[i]*arrx[j];
//inserisco nella matrice creata per ogni elemento il prodotto dell'array per sé stesso
return **matrixx;
free(matrixx);
}
dunque, io devo creare, dato un array riempito da imput con 0 o 1, una matrice i cui elementi sono la moltiplicazione di ogni elemento dell'array per tutti gli elementi dello stesso. Comunque a parte questo, cancellando pezzi e spostando il printf all'interno della funzione ho visto che fa tutto quello che deve, ma se come nel codice sopra citato voglio passare la matrice al main e dopo scorrerla con il printf ottengo segmentation fault.
Lo stesso se cancello solo la chiamata di funzione. Ho cercato su internet ma niente che aiuti. Qual'è il mio errore?