title: MPI_Scatter of 2D array and malloc
body: <p>I'm trying to write a program in C with the MPI library, in which the master process creates a 2D-array and distributes its rows of to the other processes. The matrix has dimensions <code>p*p</code>, in which <code>p</code> is the number of processes.</p>
  
  <p>Here's the code:</p>
  
  <pre class="lang-c prettyprint-override"><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;mpi.h&gt;
  
  int **createMatrix (int nrows, int ncols) {
      int **matrix;
      int h, i, j;
  
      if (( matrix = malloc(nrows*sizeof(int*))) == NULL) {
          printf("Malloc error");
          exit(1);
      }
  
      for (h=0; h&lt;nrows; h++) {
          if (( matrix[h] = malloc( ncols * sizeof(int))) == NULL) {
              printf("Malloc error 2");
              exit(1);
          }
      }
  
      for (i=0; i&lt;ncols; i++) {
          for (j=0; j&lt;nrows; j++) {
              matrix[i][j] = ((i*nrows) + j);
          }
      }
  
      return matrix;
  }
  
  void printArray (int *row, int nElements) {
      int i;
      for (i=0; i&lt;nElements; i++) {
          printf("%d ", row[i]);
      }
      printf("\n");
  }
  
  void printMatrix (int **matrix, int nrows, int ncols) {
      int i;
      for (i=0; i&lt;nrows; i++) {
          printArray(matrix[i], ncols);
      }
  }
  
  int main (int argc, char **argv) {
  
      if (MPI_Init(&amp;argc, &amp;argv) != MPI_SUCCESS) {
          perror("Error initializing MPI");
          exit(1);
      }
  
      int p, id;
      MPI_Comm_size(MPI_COMM_WORLD, &amp;p); // Get number of processes
      MPI_Comm_rank(MPI_COMM_WORLD, &amp;id); // Get own ID
  
      int **matrix;
  
      if (id == 0) {
          matrix = createMatrix(p, p); // Master process creates matrix
          printf("Initial matrix:\n");
          printMatrix(matrix, p, p);
      }
  
      int *procRow = malloc(sizeof(int) * p); // received row will contain p integers
      if (procRow == NULL) {
          perror("Error in malloc 3");
          exit(1);
      }
  
      if (MPI_Scatter(*matrix, p, MPI_INT, // send one row, which contains p integers
                      procRow, p, MPI_INT, // receive one row, which contains p integers
                      0, MPI_COMM_WORLD) != MPI_SUCCESS) {
  
          perror("Scatter error");
          exit(1);
      }
  
      printf("Process %d received elements: ", id);
      printArray(procRow, p);
  
      MPI_Finalize();
  
      return 0;
  }
  </code></pre>
  
  <p>The output I receive when running this code is</p>
  
  <pre><code>$ mpirun -np 4 test
  Initial matrix:
  0 1 2 3 
  4 5 6 7 
  8 9 10 11 
  12 13 14 15 
  Process 0 received elements: 0 1 2 3 
  Process 1 received elements: 1 50 32 97 
  Process 2 received elements: -1217693696 1 -1217684120 156314784 
  Process 3 received elements: 1 7172196 0 0 
  </code></pre>
  
  <p>Process 0 apparently receives the correct input, but the other processes show numbers I can't make sense of. Also note that the numbers of process 1 and 3 are consistent over multiple runs of the program, whereas the numbers of process 2 change in each run.</p>
  
  <p>It seems to me that there's something wrong in my memory allocating or pointer usage, but I'm quite new to programming in C. Could anyone explain to me how and why this output is produced? Secondary, obviously, I'm also interested in how to solve my issue :) thanks in advance!</p>