title: SIGSEGV accessing parameters of a structure in C
body: <p>I have written a basic data structure to solve a recursion problem in C. I don't understand why in one particular case I get a segmentation fault, even if in the other cases seems to work just fine.
  Here's just the main part of the code: if you have the patience, <a href="https://github.com/aleLoPrete/APA/blob/master/s258684_3/L8/E02/main.c" rel="nofollow noreferrer">here</a>'s the full code.</p>
  
  <pre class="lang-c prettyprint-override"><code>typedef struct{
      char color;
      int val;
  }pipe;
  
  typedef struct _tile tile;
  
  struct _tile{
      pipe pipe1;
      pipe pipe2;
      int inUse;
  };
  
  typedef struct{
      tile *theTiles;
      tile *possibleTiles;
      int tileNum;
      int numInUse;
  }tileCollection;
  
  typedef struct{
      tile *tilePointer;
      int rotation;
  }box;
  
  typedef struct{
      box **board;
      box **solMax;
      int nCol;
      int nRow;
  }boardWrap;
  
  
  void findMax(boardWrap *theBoardWrap, tileCollection *theTileColl, int col, int row){
  
      if(col == (theBoardWrap-&gt;nCol-1)){//se sono arrivato alla fine della riga
          if(row == (theBoardWrap-&gt;nRow -1)){//sono arrivato alla fine della scacchiera
              if(evaluateScore(theBoardWrap)){// se la soluzione è massima
                  theBoardWrap-&gt;solMax = theBoardWrap-&gt;board; // copio la soluzione max
              }
              return;
          }
          findMax(theBoardWrap, theTileColl, 0, row+1);//ricorro sulla riga successiva, alla prima colonna
      }
  
      if(theBoardWrap-&gt;board[col][row].tilePointer != NULL){//se la casella è già occupata
              findMax(theBoardWrap, theTileColl, col+1, row); //ricorro sulla colonna successiva
      }
      else{//se la casella è vuota
          for(int i = 0; i &lt; (theTileColl-&gt;tileNum * 2); i++){//ciclo che scorre tutte le possibili piastrelle inseribili
              if(theTileColl-&gt;possibleTiles[i].inUse == 0){//controllo se la posso mettere
                  theTileColl-&gt;possibleTiles[i].inUse = 1;//la marco come inserita
                  //inserimento piastrella
                  theBoardWrap-&gt;board[col][row].tilePointer = &amp;theTileColl-&gt;possibleTiles[i];//inserisco la piastrella
                  findMax(theBoardWrap, theTileColl, col+1, row);//ricorro sulla colonna successiva
                  theTileColl-&gt;possibleTiles[i].inUse = 0;//BACKTRACK
              }
          }
      }
  }
  
  int evaluateScore(boardWrap *theBoardWrap){//ritorna '1' se il valore attuale è maggiore del Max passato, '0' se non è così
      int scoreBoard1, scoreBoardMax;
  
      scoreBoardMax = boardScoreCalc(theBoardWrap, theBoardWrap-&gt;solMax);
      scoreBoard1 = boardScoreCalc(theBoardWrap, theBoardWrap-&gt;board);
      if(scoreBoard1 &gt; scoreBoardMax) {
          return 1;
      }
      else
              return 0;
      }
  
  int boardScoreCalc(boardWrap *theBoardWrap, box **board){//se passo la la board by reference ho un SIGSEGV, se la passo by value no
      int flagRowColor = 0, flagColColor = 0;
      int totScoreRow = 0;
      int totScoreCol = 0;
      int rowPoints[theBoardWrap-&gt;nRow], colPoints[theBoardWrap-&gt;nCol];
  
      for(int i = 0; i &lt; theBoardWrap-&gt;nRow; i++){
          for(int j = 0; j &lt; theBoardWrap-&gt;nCol; j++){
              //calcolo il punteggio per la riga
              if(j == 0){//inizio riga
                  rowPoints[i] = board[i][j].tilePointer-&gt;pipe1.val;
                  flagRowColor = 1;
              }
              else if(matchColor(theBoardWrap-&gt;board[i][j].tilePointer-&gt;pipe1.color,theBoardWrap-&gt;board[i][j-1].tilePointer-&gt;pipe1.color) &amp;&amp; flagRowColor){
                  rowPoints[i] += board[i][j].tilePointer-&gt;pipe1.val;
              }
              else{
                  rowPoints[i] = 0;
                  flagRowColor = 0;
              }
              //calcolo il punteggio per le colonne
              if(i == 0){//inizio colonna
                  colPoints[j] = board[i][j].tilePointer-&gt;pipe2.val;
                  flagColColor = 1;
              }
              else if(matchColor(theBoardWrap-&gt;board[i][j].tilePointer-&gt;pipe1.color,theBoardWrap-&gt;board[i-1][j].tilePointer-&gt;pipe1.color) &amp;&amp; flagColColor){//HERE I GET SEGSIGV
                  colPoints[j] += board[i][j].tilePointer-&gt;pipe2.val;
              }
              else {
                  colPoints[j] = 0;
                  flagColColor = 0;
              }
          }
      }
      for(int i = 0; i &lt; theBoardWrap-&gt;nRow; i++){
          totScoreRow += rowPoints[i];
      }
      for(int j = 0; j &lt; theBoardWrap-&gt;nCol; j++){
          totScoreCol *= colPoints[j];
      }
      return totScoreCol + totScoreRow;
  }
  
  </code></pre>