buona sera,
ho ricevuto un esercizio all'università e a prescindere dalla traccia che non scriverò, anche perchè è implementata nei commenti del codice, non riesco a risolvere il problema di segmentation fault durante il run del programma. ve lo posto così potete voi più esperti cercar di trovare l'errore.

codice:
#include <iostream>
#include <string>
using namespace std;
void operazioni_diagonali (int **X, int a);
int somma_ric (int **X, int a);
void concatena_una_riga (int **X, int n);
main ()
{
//
// leggere da tastiera gli elementidi una matrice di dimensioni NxN allocandola dinamicamente
//
cout << "inserisci la dimensione N della tua matrice NxN" << endl;
int n;
cin >> n;
int **A=new int *[n];
int i, j;
for (i=0; i<n; i++)
{
  A[i]=new int [n];
}
//
// inserimento di "0" in tutta la matrice
//
for (i=0; i<n; i++)
{
    for (j=0; j<n; j++)
    {
      A[i][j]=0;
    }
}
//
//
// allocazione dinamica terminata
//
// inserimento da tastiera dei valori sulle 3 diagonali della matrice
// (non verranno quindi inseriti elementi non delle diagonali
//
cout << "inserisci gli elementi delle 3 diagonali principali della matrice NxN" << endl << "prima diagonale (principale): " << endl;
for (i=0; i<n; i++)
{
  cin >> A[i][i];
}
cout << "seconda diagonale (inferiore)" << endl;
j=0;
for (i=1; i<n; i++)
{
  cin >> A[i][j];
  j++;
}
cout << "terza diagonale (superiore)" << endl;
j=1;
for (i=0; i<n-1; i++)
{
  cin >> A[i][j];
  j++;
}
//
// diagonali inserite
//
// operazioni su diagonali
//
operazioni_diagonali (A, n);
// la funzione calcolerà tutto il resto
//
// chiamata della funzione "concatena_una_riga"
//
concatena_una_riga (A, n);
// termine programma
for (i=0; i<n; i++)
  {
  delete[] A[i];
  }
delete[] A;
return 0;
}







// prototipo funzione operazioni_diagonale
void operazioni_diagonali (int **X, int a)
{
//
// calcolo della somma sulla diagonale inferiore attraverso un'altra funzione "somma_ric" ricorsiva
//
cout << "la somma degli elementi sulla diagonale inferiore e': " << somma_ric (X, a) << endl;
//
//
// calcolo (non ricorsivo) della media degli elementi sulle rimanenti 2 diagonali
//
int i, j, media=0, contatore_per_la_media=0;
for (i=0; i<a; i++)
{
  media=media+X[i][i];
  contatore_per_la_media++;
}
for (i=0; i<a-1; i++)
{
  for (j=1; j<a-1; j++)
  {
    media=media+X[i][j];
    contatore_per_la_media++;
  }
}
media=media/contatore_per_la_media;
cout << "la media della somma della diagonale superiore e principale e': " << media << endl;
}





// prototipo della funzione ricorsiva "somma_ric" usata dalla funzione "operazioni_diagonali"
int somma_ric (int **X, int a)
{
if (a=0)
{
  return X[a+1][a];
}
else
{
  return X[a+1][a]+somma_ric (X, a-1);
}
}






// prototipo di "concatena_una_riga"
void concatena_una_riga (int **X, int a)
{
int i=1, j=0, h=0, k=1;
string stringa;
for (i=0; i<a-1; i++)
{
  stringa=X[i][j]+X[h][k];
  cout << "stringa concatenamento simmetrico " << i+1 << " = " << stringa << endl;
  i++;
  j++;
  h++;
  k++;
}
}
grazie!!