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?