黑马程序员技术交流社区
标题:
局部变量的生存周期问题
[打印本页]
作者:
瑾❤
时间:
2014-6-12 23:25
标题:
局部变量的生存周期问题
本帖最后由 瑾❤ 于 2014-6-13 22:50 编辑
/*
*使用单链表结构存储所有人的信息
*/
#include <stdio.h>
#include <string.h>
typedef struct Person
{
char name[50];
struct Person *nextPer; //指向下一个人
}PersonInfo;
//定义头指针结构体
typedef struct
{
int count;
struct Person *nextPer; //指向下一个人
}PerHead;
//添加人并输出处理结果
void addPer(PerHead *source)
{
//存储待添加的人
PersonInfo per;
PersonInfo *temp;
//提示/输入姓名
printf("Input the name:");
scanf("%s",per.name);
getchar();
//将人存入source链表中,并将计数器加一
source->count++;
per.nextPer=source->nextPer;
source->nextPer=&per;
printf("\nAdd student:%s",per.name);
//打印全部人
printf("\n_________ALL_________\n");
printf("have %d person\n",source->count);
temp=source->nextPer;
while(temp!=NULL)
{
printf("person:%s\n",temp->name);
temp=temp->nextPer;
}
}
int main()
{
//定义变量用于存储所有人
PerHead AllPerson={0,NULL};
while(1)
{
char command;
printf("\n^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("A(Add) Q(Quit)\n");//提示用户输入对应的命令字符(A、Q)
scanf("%c",&command);
getchar();
switch(command)//根据命令的不同执行不同操作
{
case 'Q': //退出
return 0;
case'A': //添加
addPer(&AllPerson);
break;
default: //其他非法字符时不做处理
break;
}
}
return 0;
}
复制代码
程序功能:从控制台循环输入人的信息并存入一个单链表AllPerson中
问题描述:第一次添加人员时一切正常,第二次添加人员后,输出全部人员时进入死循环,并打印的是同一个人,这是什么原因呢?
result.JPG
(40.29 KB, 下载次数: 36)
下载附件
2014-6-12 23:24 上传
作者:
陈超众
时间:
2014-6-13 00:46
学习了啊
作者:
瑾❤
时间:
2014-6-13 22:50
找到原因了: 由于退出addPer方法时,局部变量per被回收,重新进入时,又给per分配了与先前一样的存储空间,导致指针指向异常
解决方案:
//添加人并输出处理结果
void addPer(PerHead *source)
{
//存储待添加的人
PersonInfo *per=(PersonInfo *)malloc(sizeof(PersonInfo));//动态分配内存空间
PersonInfo *temp;
//提示/输入姓名
printf("Input the name:");
scanf("%s",per->name);
getchar();
//将人存入source链表中,并将计数器加一
source->count++;
per->nextPer=source->nextPer;
source->nextPer=per;
printf("\nAdd student:%s",per->name);
//打印全部人
printf("\n_________ALL_________\n");
printf("have %d person\n",source->count);
temp=source->nextPer;
while(temp!=NULL)
{
printf("person:%s\n",temp->name);
temp=temp->nextPer;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2