title: Segmentation fault in implementing malloc
body: <p>I am coding a gauss seidel program and I am currently having a problem in using malloc.</p>
  
  <p>Please help me with this. I haven't started with the gauss seidel iterative because I was stuck here.</p>
  
  <p>The error says "segmentation fault (core dumped)."  I do not know what it means. I tried scanning the code several times but I just can't find the error.</p>
  
  <p>COULD THERE BE SOMETHING WRONG WITH THE WAY I USED FSCANF?</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  
  //structure declarations
  struct table2   {
  int k;
  float value;
  int row;
  int col;
  int nextK_row;
  int nextK_col;
  };
  
  struct table3   {
  int index;
  int fir;
  int fic;
  };
  
  
  //function prototypes
  void allocate_memory(int num_unknowns, int num_entries, struct table2 *pTable2, struct table3  *pTable3, float *b, FILE* fInput, FILE* fOutput);
  
  void free_close (FILE* fInput, FILE* fOutput, struct table2 *pTable2, struct table3 *pTable3, float *b);
  
  
  int main (int argc, char* argv[])   {
  
  
  //variable declarations
  FILE *fInput=NULL;
  FILE *fOutput=NULL;
  struct table2 *pTable2=NULL;
  struct table3 *pTable3=NULL;
  int num_unknowns, num_entries;
  float *b=NULL;
  int i, j, m;
  int count1, count2, count3, count4, l;
  
  
  
  //check if arguments from user is 3, else error
  if (argc!=3)    {
      printf("Error, the number of arguments should be exactly as needed(three).\n");
      return 1;
  }
  
  
  //open input file
  fInput = fopen(argv[1], "r");
  //check if input file opened successfully
  if (fInput == NULL) {
      printf("Error. Input file wasn't opened successfully.\n");
      return 1;
  }
  
  //open output file
  fOutput = fopen(argv[2], "w");
  //check if output file opened successfully
  if (fOutput == NULL)    {
      printf("Error. Output file wasn't opened successfully.\n");
      return 1;
  }
  
  //scan no. of unknowns from file and check if successful
  count1 = fscanf(fInput, " %d", &amp;num_unknowns);
  if (count1 != 1)    {
      printf("Error, fscanf() did not read number of unknowns successfully.");    
  //call function to free memory and close files
  free_close (fInput, fOutput, pTable2, pTable3, b);
  return 1;
  }
  
  
  //scan no. of entries from file and check if successful
  count2 = fscanf(fInput, " %d", &amp;num_entries);
  if (count2 != 1)    {
      printf("Error, fscanf() did not read number of entries successfully."); 
  //call function to free memory and close files
  free_close (fInput, fOutput, pTable2, pTable3, b);
  return 1;
  }
  
  
  //call function to allocate memory
  allocate_memory(num_unknowns, num_entries, pTable2, pTable3, b, fInput, fOutput);
  
  
  //loop to read values from Table2 and check if it read successfully
  for(i=1; i&lt;=num_entries; i++)   {
      count3 = fscanf(fInput, " %d %f %d %d %d %d", &amp;(pTable2[i].k), &amp;(pTable2[i].value), &amp;(pTable2[i].row), &amp;(pTable2[i]).col, &amp;(pTable2[i].nextK_row), &amp;(pTable2[i].nextK_col));
      if (count3 != 6)    {
          printf("Error, fscanf() did not read table 2 values successfully.");
  //call function to free memory and close files
          free_close (fInput, fOutput, pTable2, pTable3, b);
          return 1;
      }
  }
  
  //loop to get values from Table3
  for(j=1; j&lt;=num_unknowns; j++)  {
      count4 = fscanf(fInput, " %d %d %d", &amp;(pTable3[j].index), &amp;(pTable3[j].fir), &amp;(pTable3[j].fic));
      if (count4 != 3)    {
          printf("Error, fscanf() did not read table3 values successfully.");
  //call function to free memory and close files
          free_close (fInput, fOutput, pTable2, pTable3, b);
          return 1;
      }
  }
  
  //loop to get constants from file
  for(m=1; m&lt;=num_unknowns ; m++) {
      l = fscanf(fInput, " %f", &amp;(b[m]));
      if (l != 1) {
          printf("Error, fscanf() did not read constant values successfully.");
  //call function to free memory and close files
          free_close (fInput, fOutput, pTable2, pTable3, b);
          return 1;
      }
  }
  
  
  
  //test print
  for(i=1; i&lt;=num_entries; i++)   {
      printf("%d\t", pTable2[i].k);
      printf("%f\t", pTable2[i].value);
      printf("%d\t", pTable2[i].row);
      printf("%d\t", pTable2[i].col);
      printf("%d\t", pTable2[i].nextK_row);
      printf("%d\t", pTable2[i].nextK_col);
  }
  printf("\n\n\n");
  for(j=1; j&lt;=num_unknowns; j++)  {
      printf("%d\t", pTable3[j].index);
      printf("%d\t", pTable3[j].fir);
      printf("%d\t", pTable3[j].fic);
  }
  printf("\n\n\n");
  for(m=1; m&lt;=num_unknowns ; m++) {
      printf("%f", b[m]);
      }
  printf("\n\n\n");
  
  
  
  
  
  
  
  //call function to free memory and close files
  free_close (fInput, fOutput, pTable2, pTable3, b);
  
  
  return 0;
  }
  
  
  
  //function to allocate memory
  void allocate_memory(int num_unknowns, int num_entries, struct table2* pTable2, struct table3* pTable3, float* b, FILE* fInput, FILE* fOutput)  {
  
  
  //allocate memory for table 2   
  pTable2 = (struct table2* ) malloc(24*num_entries);
  if (pTable2 == NULL)    {
      printf("Error, memory allocation for table2 failed.");
  //call function to free memory and close files
      free_close (fInput, fOutput, pTable2, pTable3, b);
      exit(-1);
  }
  
  //allocate memory for table 3
  pTable3 = (struct table3* ) malloc(12*num_unknowns);
  if (pTable3 == NULL)    {
      printf("Error, memory allocation for table3 failed.");
  //call function to free memory and close files
      free_close (fInput, fOutput, pTable2, pTable3, b);
      exit(-1);
  } 
  
  //allocate memory for constants
  b = (float*) malloc(sizeof(float)*num_unknowns);
  if (b == NULL)  {
      printf("Error, memory allocation for matrix B entries failed.");
  //call function to free memory and close files
      free_close (fInput, fOutput, pTable2, pTable3, b);
      exit(-1);
  }
  
  return;
  }
  
  
  //function to free allocated memory and close files
  
  void free_close (FILE* fInput, FILE* fOutput, struct table2 *pTable2, struct table3 *pTable3, float *b) {
  
  if (fInput != NULL)
      fclose(fInput);
  if (fOutput != NULL)
      fclose(fOutput);
  
  if (pTable2 != NULL)
      free(pTable2);
  if (pTable3 != NULL)
      free(pTable3);
  if (b != NULL)
      free(b);
  
  return;
  }
  </code></pre>