代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct stu_tea
{
char name[20];
int age;
char job;
union
{
int classno;
char office[10];
}depart;
};
void main()
{
//struct stu_tea body[2];
struct stu_tea *p;
p=(stu_tea*)malloc(2*sizeof(stu_tea));
if(p==NULL)
{
exit(0);
}
int i;
for(i=0;i<2;i++)
{
//scanf(“%s %d %c”,body[i].name,&body[i].age,&body[i].job);
scanf(“%s %d %c”,p->name,&p->age,&p->job);
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct stu_tea
{
char name[20];
int age;
char job;
union
{
int classno;
char office[10];
}depart;
};
void main()
{
//struct stu_tea body[2];
struct stu_tea *p;
p=(stu_tea*)malloc(2*sizeof(stu_tea));
if(p==NULL)
{
exit(0);
}
int i;
for(i=0;i<2;i++)
{
//scanf(“%s %d %c”,body[i].name,&body[i].age,&body[i].job);
scanf(“%s %d %c”,p->name,&p->age,&p->job);
if(p->job==”s”)
scanf(“%d”,&p->depart.classno);
else
scanf(“%s”,p->depart.office);
p++;
}
for(i=0;i<2;i++)
p–;
for(i=0;i<2;i++)
{
if(p->job==”s”)
printf(“%s\t%3d%3c %d\n”,p->name,p->age,p->job,p->depart.classno);
else
printf(“%s\t%3d%3c %s\n”,p->name,p->age,p->job,p->depart.office);
p++;
}
free (p);
}
问题:
程序能运行,但是会有下图这个错误
解决方案
40
这个是堆释放出错才会出现的异常
原因在于你printf完以后没有把p重新–回到内存开始的位置,所以free出错
原因在于你printf完以后没有把p重新–回到内存开始的位置,所以free出错
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct stu_tea { char name[20]; int age; char job; union { int classno; char office[10]; }depart; }; void main() { //struct stu_tea body[2]; struct stu_tea *p; p=(stu_tea*)malloc(2*sizeof(stu_tea)); if(p==NULL) { exit(0); } int i; for(i=0;i<2;i++) { //scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job); scanf("%s %d %c",p->name,&p->age,&p->job); if(p->job=="s") scanf("%d",&p->depart.classno); else scanf("%s",p->depart.office); p++; } for(i=0;i<2;i++) p--; for(i=0;i<2;i++) { if(p->job=="s") printf("%s\t%3d%3c %d\n",p->name,p->age,p->job,p->depart.classno); else printf("%s\t%3d%3c %s\n",p->name,p->age,p->job,p->depart.office); p++; } for(i=0;i<2;i++) p--; free (p); }
20
1)第二次循环,越界访问,原因是第一次循环的两次 p++造成 p越界了
2)free 的指针,不是 malloc 或 realloc 或 calloc 分配的内存
malloc 和 free 要对应
也就是说free 的时候,实参指针的值,应该是 malloc 分配的内存地址值。
(其实 free 的时候,跟指针变量名字,不相干,只需要值跟分配的时候相等,就可以了,
千万不要以为名字没变,就是对的)
你这里,两个循环,p++ 执行了四次,不再是分配时候的值了,释放内存出错
2)free 的指针,不是 malloc 或 realloc 或 calloc 分配的内存
malloc 和 free 要对应
也就是说free 的时候,实参指针的值,应该是 malloc 分配的内存地址值。
(其实 free 的时候,跟指针变量名字,不相干,只需要值跟分配的时候相等,就可以了,
千万不要以为名字没变,就是对的)
你这里,两个循环,p++ 执行了四次,不再是分配时候的值了,释放内存出错