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

问题:结构体成员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;
}

4个回答

先释放name,再释放结构体,因为name是指针

TTmrxb
TTmrxb 报错截图见楼下
4 年多之前 回复
TTmrxb
TTmrxb 释放完name,再释放结构体的话,就会报错:pointer being freed was not allocated。搞不明白为什么会这样
4 年多之前 回复

图片说明

struct student* studentIOS = (struct student*)malloc(50 * sizeof(struct student));

这个定义实际上studentIOS应该是指指针数组的首地址。

TTmrxb
TTmrxb for (int i=0; i<50; ++i,++studentIOS) { //加上此循环,程序出问题,提示studentIOS未malloc if (NULL != studentIOS->name) { free(studentIOS->name); studentIOS->name = NULL; } }
4 年多之前 回复
TTmrxb
TTmrxb 回复南方庸人: 通过循环控制指针偏移了,拷到记事本出来代码不一样了。原代码如下:
4 年多之前 回复
TTmrxb
TTmrxb 回复南方庸人: 通过循环控制指针偏移了,拷到记事本出来代码不一样了。原代码如下:
4 年多之前 回复
w35995
南方庸人 我的意思是studentIOS不能直接指向name,你毕竟分配了50个student结构,你得指明是 free 哪一个。
4 年多之前 回复

把结构体占用的内存释放就行了,字符串指针数据只是一个地址,如果结构体释放,那么字符串所在的地址就没有引用了,系统会自己回收掉的。

TTmrxb
TTmrxb 字符串用malloc分配的那部分空间,没有被free标记,也会自己释放吗?
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐