realloc structure with function in C

与世无争的帅哥 提交于 2019-12-31 07:21:09

问题


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;
}

回答1:


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




回答2:


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




回答3:


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));
.
.
.
}


来源:https://stackoverflow.com/questions/17680096/realloc-structure-with-function-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!