求指导释一下这个错误的原因?麻烦进来看一下,谢谢

C语言 码拜 9年前 (2016-04-13) 770次浏览
代码:
#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出错

#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++ 执行了四次,不再是分配时候的值了,释放内存出错

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求指导释一下这个错误的原因?麻烦进来看一下,谢谢
喜欢 (0)
[1034331897@qq.com]
分享 (0)