无法在我的C程序中释放内存

时间:2014-11-25 18:50:37

标签: c

我需要你帮助在下面的程序中释放内存。我试过,你可以看到主要,但没有成功。无法理解如何做到这一点。

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

typedef struct{
char name[25];
char street[25];
char citystate[25];
char zip[6];
}student;

 typedef student *studinfo;

 /*function prototypes*/
 void getinfo(student *details[], int *);

 int main(void)
{

int count = 0;
student *studptr[49];

getinfo(studptr, &count);/*call getinfo function to get student info*/


/*int i = 0;
for (i; i<count; i++) {

    free(studptr[i]->name);
    free(studptr[i]->street);
    free(studptr[i]->citystate);
    free(studptr[i]->zip);
   } */

   return 0;
  }

以下是从文件中获取信息的功能。稍后我将在sort函数和display函数中使用此信息来显示结果。之后,我应该释放内存。

void getinfo(student *details[], int *count)
{

char s[100];
studinfo info;

/*Get student information*/
while (gets(s) != NULL) {
    info = (studinfo)malloc(sizeof(student));
    strcpy(info->name, s);
    gets(info->street);
    gets(info->citystate);
    gets(info->zip);


    details[(*count)++] = info; /*Increase the pointer to next position*/

    } /* End of while loop*/

     } /* End of getinfo */

2 个答案:

答案 0 :(得分:1)

您的代码有三个问题:

  • 您正在尝试释放struct student的组件。由于这些组件数组未分配malloc,因此您无法释放它们;您只需要释放struct本身。
  • 您正在使用gets,这可能会导致缓冲区溢出。您应该使用fgets代替,传递缓冲区大小,stdin代表FILE*参数。
  • 您将s[100]复制到info->name。这可能会超出缓冲区,因为info->name只能容纳25个字符。

修复这些问题后,您的程序应该正常运行。

答案 1 :(得分:1)

应该是:

int i;
for (i = 0; i < count; i++) {
    free(studptr[i]);
}

由于您将每个student分配为一个块,因此您可以采用相同的方式释放它们。