gpt4 book ai didi

c - 释放具有 char 指针的结构数组

转载 作者:行者123 更新时间:2023-11-30 19:49:08 27 4
gpt4 key购买 nike

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int id;
char *name;
char *lastname;
} student_type;
typedef struct
{
student_type list[15];
} student_list_type;
void get_students(FILE *input,char *filename,student_list_type *student_list);
int main()
{
printf("Hello world!\n");
student_list_type std_list;
student_list_type *std_list_p=&std_list;
FILE *input;
get_students(input,"students.txt",std_list_p);
return 0;
}
void get_students(FILE *input,char *filename,student_list_type *student_list)
{

int i=0;
int j=0;
input=fopen(filename,"r");
printf("filename is %s",filename);
while(fscanf(input,"%d",&student_list->list[i].id)==1)
{
student_list->list[i].name=(char *) malloc(15);
student_list->list[i].lastname=(char *) malloc(15);
fscanf(input,"%s",student_list->list[i].name);
fscanf(input,"%s",student_list->list[i].lastname);
i++;
}

for(j=0; j<i+1; j++)
{
free(student_list->list[i].name);
free(student_list->list[i].lastname);
}
free(student_list->list);
fclose(input);
}

我认为我未能释放部分代码。我已经知道我应该先释放元素然后释放整个数组,但我可能学到了错误的方法。无论如何,这段代码不会给出错误消息,但有时在获取所有内容后会崩溃来自 txt 的学生列表。

最佳答案

首先,您不检查 fopen 是否成功,如果失败,fscanf 仍会尝试打开变量输入,但在这种情况下将为 NULL。

为什么要声明“File * input;”主要?如果您在下一刻将其传递给函数“get_student”。为什么不在函数中直接声明呢?

此代码更安全

void get_students(char *filename,student_list_type *student_list)
{
int i=0;
int j=0;

FILE * input;

input=fopen(filename,"r");
printf("filename is %s",filename);

if((input = fopen("students.txt","r")) == NULL)
{
fprintf(stderr, "\nFile could not be open\n");
}
else
{
while(fscanf(input,"%d",&student_list->list[i].id)==1)
{
student_list->list[i].name=(char *) malloc(15);
student_list->list[i].lastname=(char *) malloc(15);
fscanf(input,"%s",student_list->list[i].name);
fscanf(input,"%s",student_list->list[i].lastname);
i++;
}

for(j=0; j<i+1; j++)
{
free(student_list->list[i].name);
free(student_list->list[i].lastname);
}

fclose(input);
}
}

最后你不需要释放它

free(student_list->list);

因为student_list没有在堆上分配。

关于c - 释放具有 char 指针的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15526716/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com