0

My C program is crashing and I am too new to figure it out. It's very simple so far and I imagine the code is enough to figure out what is going wrong.

I am simply trying to read a file line by line. I will double the memory of a structure once I am out of memory. If this is not enough information, I will give whatever else you need.

Thank you very much for any help, as I have been stuck for hours now.

/*
John Maynard
1000916794
7/15/2013
HW-06
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 100

struct course
{
   char subject[11];
   int catalogNum;
   int sectionNum;
   int enrollmentTotal;
   int enrollmentCap;
};

void readFile(struct course *d, char* filename);

void double_array_size(struct course *d, int new_size);

int main(void)
{
   char *filename = "hw06-data.csv";
   struct course *d;

   d = malloc( N * sizeof(struct course));

   readFile(d, filename);

}


void readFile(struct course *d, char* filename)
{
   FILE* fp;
   char buffer[100];
   int i = 0, array_size = 100;
   struct course *temp;


   if( ( fp = fopen(filename, "r") ) == NULL)
   {
      printf("Unabale to open %s.\n", filename);
      exit(1);
   }

   fgets(buffer, sizeof(buffer), fp);

   while( fgets(buffer, sizeof(buffer), fp) != NULL)
   {
      if (i == array_size)
      {
         array_size *= 2;
         double_array_size(d, array_size);
         printf("reached limit...increasing array to %d structures\n", array_size);
      }



      i++;
   }
   fclose( fp );
}

void double_array_size(struct course *d, int new_size)
{
   struct course *temp;

   temp = realloc(d, new_size * sizeof(struct course));

   if(temp == NULL)
   {
      printf("unable to reallocate\n");
      exit(1);
   }

   else
      d = temp;
}

3 Answers 3

2

realloc() may return a different pointer than the original one but you assign that to temp only so the calling function still works with the original pointer afterwards. Change double_array_size() to return the new pointer returned by realloc() and call

d = double_array_size(d, array_size);

Furthermore you should always check the result fo malloc(), realloc() etc. They may return NULL if there is no more memory available

Sign up to request clarification or add additional context in comments.

Comments

0

Combining Ingo's and codroipo's answers, you have to either return the new pointer from double_array_size, or you have to pass in a pointer to d so you can update the pointer from double_array_size

Comments

0

Realloc reallocates memory, so probably memory pointed by d will be released, so double_array_size has to edit d, you could try:

void double_array_size(struct course** d, int new_size){
*d = realloc(*d, new_size * sizeof(struct course));
.
.
.
}

1 Comment

In that case it should be struct course **d and *d=realloc(*d,...)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.