En primer lugar, en la función main() estás asignando un valor 0 a una variable que es un puntero. En C/C++ los punteros se inicializan a valor NULL, este es un valor que la máquina reconoce como dirección no válida (un puntero es una dirección de memoria), y puede que este valor coincida con cero o puede qaue no, depende de la implementación.
El fallo se genera en la función crea_matriz. A esta función le pasas como parámetro el tamaño de la matriz que deseas (correcto) y la matriz en la que quieres guardar los datos. Aquí está el origen del error. Pasas como parámetro un puntero (que, en principio, vale NULL).Dentro de la función, modificas este puntero al crear la matriz. Lo que has hecho, en realidad, es modificar una copia de ese puntero, con lo que la modificación la pierdes al salir de la función. Cuando vuelve a main() para llamar a la función rellena_matriz, la matriz que estás pasando en realidad es el puntero nulo que ya tenías, lo que te provoca el error: Estás intentando acceder a una zona de memoria a través de un puntero nulo. Los errores Segmentation fault (o Violation Access en otros compiladores) están casi siempre relacionados con mal uso de punteros.
Prueba con esto:
Código C++:
Ver originalint main()
{
matriz M = NULL;
cout<<"Ingresa el tamaño de la matriz: ";
int n;
cin>>n;
M = crear_matriz(n);
rellena_matriz(n, M);
}
matriz crear_matriz(int n)
{
matriz M;
M = new double* [n];
for (int i=0; i<n; i++)
M[i] = new double [n];
return M;
}
Además, dado que reservas memoria de manera dinámica, deberás liberar esa memoria cuando ya no la necesites. Conviene que crees también una función para eliminar una matriz, y elimines las matrices que generes conforme ya no las necesites.
Saludos,