【问题标题】:realloc structure with function in C具有C语言功能的realloc结构
【发布时间】:2013-07-14 20:14:57
【问题描述】:

我的 C 程序崩溃了,我太新了,无法弄清楚。到目前为止它非常简单,我想代码足以找出问题所在。

我只是想逐行读取文件。一旦内存不足,我会将结构的内存加倍。如果这些信息还不够,我会提供您需要的任何其他信息。

非常感谢您的帮助,因为我已经卡了好几个小时了。

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

【问题讨论】:

    标签: c memory dynamic allocation realloc


    【解决方案1】:

    realloc会重新分配内存,所以可能d指向的内存会被释放,所以double_array_size要编辑d,你可以试试:

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

    【讨论】:

    • 在这种情况下应该是struct course **d*d=realloc(*d,...)
    【解决方案2】:

    realloc() 可能会返回与原始指针不同的指针,但您将其分配给 temp,因此调用函数之后仍可使用原始指针。更改double_array_size() 以返回realloc() 返回的新指针并调用

    d = double_array_size(d, array_size);
    

    此外,您应该始终检查 malloc()realloc() 等的结果。如果没有更多可用内存,它们可能会返回 NULL

    【讨论】:

      【解决方案3】:

      结合 Ingo 和 codroipo 的答案,您必须从 double_array_size 返回新指针,或者您必须传入指向 d 的指针,以便您可以从 double_array_size 更新指针

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多