Na verdade acredito que o problema é que, na função CriaMatriz(), você está alocando a memória para um array de "lin" objetos do tipo Mat e a armazenando em um ponteiro temporário e ainda retornando o conteúdo daquele ponteiro. Já na main, por sua vez, você está declarando um ponteiro sem inicializá-lo e está tentando atribuir o retorno da CriaMatriz nele, o que está gerando a falha de segmentação.
O mais apropriado seria você retornar o ponteiro que alocou na CriaMatriz(), lembrando de, na função LiberarMemoria, liberar tanto a memória do vetor de elementos "v" quanto do objeto Mat.
Tente este código:
//matriz.h#ifndef matriz_h#define matriz_h typedef struct{ int linhas,colunas,*v;} Mat; Mat* CriarMatriz();void AdicionarElemento(Mat **);void AcessarElemento(Mat **);void getNumeroLinhas(Mat **);void getNumeroColunas(Mat **);void LiberarMemoria(Mat **);#endif//matriz.cpp#include <iostream>#include "matriz.h"using namespace std;Mat* CriarMatriz(){ int lin,col; cout<<"Entre com o numero de linhas"<<endl; cin>>lin; cout<<"Entre com o numero de colunas"<<endl; cin>>col; Mat *M= new Mat(); M->linhas=lin; M->colunas=col; M->v=new int [lin*col]; return M;}//main.cpp#include <iostream>#include "matriz.h"using namespace std;int main(){ Mat *M; M = CriarMatriz(); AdicionarElemento(&M); AcessarElemento(&M); getNumeroLinhas(&M); getNumeroColunas(&M); LiberarMemoria(&M); return 0;}
Vou testar ele aqui agora e se der algum problema edito o post.