结构体内指针字符数组的释放

问题:结构体成员char* name和结构体struct student* studentIOS同时释放的话回报错,错误见代码中注释。请问这里要怎么释放呢?还是结构体里面不能这样使用指针字符数组?

#include
#include

struct student{
int id; //长度:4
char* name; //8
int score[2]; //8
float avgScore; //4
};

void input(struct student*);
void output(struct student*);

void input(struct student* stu){
printf("(1)程序最多接受50名学生的信息,多余的无法录入\n");
printf("(2)不足50人,请输入-1结束输入\n");
for (int i=0; i<50; ++i) {

    (stu+i)->name = (char*)malloc(15 * sizeof(char));   //给结构体中学生的name分配空间

    printf("请在下面输入第%d名学生的信息\n",i+1);
    printf("序号:");
    scanf("%d",&(stu+i)->id);

    if (-1 == (stu+i)->id) {        //输入-1的时候,停止输入;退出输入函数
        printf("输入结束\n");
        return ;
    }

    printf("姓名:");
    //gets((stu+i)->name);
    scanf("%s",(stu+i)->name);

    printf("C语言成绩:");
    scanf("%d",&(stu+i)->score[0]);

    printf("数序成绩:");
    scanf("%d",&(stu+i)->score[1]);

    (stu + i)->avgScore =( (stu + i)->score[0] + (stu + i)->score[1])/2.0;
}

return;

}
void output(struct student* stu){
printf("学生信息如下\n");
printf("学号\t\t姓名\t\tC语言\t数学\t\t平均\n");
for (int i=0; i if (stu->id == -1) {
break;
}
printf("%d\t\t%s\t\t%d\t\t%d\t\t%.2f",stu->id,stu->name,stu->score[0],stu->score[1],stu->avgScore);
printf("\n");
}
return;
}
int main(int argc, const char * argv[]) {
struct student* studentIOS = (struct student*)malloc(50 * sizeof(struct student));
input(studentIOS);
//output(studentIOS);

// printf("%p\n%p",studentIOS->name,&studentIOS->name); //输出不同

/*
 释放每个学生的name空间,或者释放学生结构体的空间, 测试发现二者只能释放一个
 */

//释放每个学生中的name空间

#if 0 //加上此循环,程序出问题,提示studentIOS未malloc
for (int i=0; i if (NULL != studentIOS->name) {
free(studentIOS->name);
studentIOS->name = NULL;
}
}
#endif

#if 0 //加上下面的两句不会出问题
free((studentIOS+10)->name);

(studentIOS+10)->name = NULL;
#endif
free(studentIOS);
studentIOS = NULL;
return 0;
}

查看全部
TTmrxb
TTmrxb
2015/09/16 13:16
  • c
  • 指针
  • 点赞
  • 收藏
  • 回答
    私信

4个回复