2 qq 33582651 qq_33582651 于 2016.03.02 16:25 提问

子函数结束后没有返回主函数就崩溃了怎么回事

#include
#include
#include
typedef struct reader{
char name[10];
char key[6];
int kind;//普通读者
struct reader *next;
}reader;
typedef struct bookers{
char name[10];
char key;
int kind;//图书管理员
struct bookers *next;
}bookers;
typedef struct allers{
char name[10];
char key;
int kind;//系统管理员
struct allers *next;
}allers;
typedef struct allbooks{
int read;//记录号
int num;//书号
char name[50];//书名
char write[10];//作者
char pub[30];//出版社
int have;//藏书量
int take;//借出数
struct allbooks *next;
}allbooks;
void start(reader *head,bookers *_head,allers *head_);
void readerstart(reader *head);
void online(reader *head,bookers *_head,allers *head_)
{
gome: printf("\t\t请输入用户名\n");
char name[10];int choice=3;
fflush(stdin);
scanf("%s",name);////判断普通用户!!!!
while(head->next!=NULL)//确认字符串比较返回值
{
int a=strcmp(name,head->name);
if(a==0)
{

while(choice>=0)
{
if(choice==0)
{
printf("\t\t请重新登录!!\n");
goto gome;
}

            printf("\t\t请输入密码\n");
            char key[6];
            scanf("%s",key);
            if(strcmp(key,head->key)==0)
            {goto in;}//用户管理系统
            else
            {
                choice--;
                printf("密码输入错误,您还有%d次机会",choice);
            }
        }
    }
    else
    head=head->next;
}

in: readerstart(head);
}
void readerstart(reader head)
{
printf("
***************************************************\n");
printf("\t欢迎进入图书管理系统,您可以进行以下功能:\n");
printf("\t\t\t 1. 用户信息输入\n");
printf("\t\t\t 2. 用户信息修改\n");
printf("\t\t\t 3. 用户信息删除\n");
printf("\t\t\t 4. 用户信息显示\n");
printf("\t\t\t 5. 用户密码修改\n");
printf("\t\t\t 6. 返回主菜单\n");
int choice;
printf("请输入您想使用的功能:");
scanf("%d,&choice");
switch(choice)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
}
}

void start(reader head,bookers *_head,allers *head_)
{
char a='n';
/
while(a!='y'||a!='Y')
{*/
printf("\t\t 欢迎进入图书管理系统\n");
printf(" *********************************************\t\n ");
printf("\t\t\t用户登录");
getchar();
online(head,_head,head_);
/* printf("\t\t是否退出?");
printf("Y N");
fflush(stdin);
scanf("%c",&a);
}*/
}
void main()

{
reader *head;bookers *_head;allers *head_;
head=(reader *)malloc(sizeof(reader));
strcpy(head->name,"123");
strcpy(head->key,"789");
start(head,_head,head_);
printf("欢迎下次使用!");
}
选择6之后并不能退出程序,调试发现start函数中内容运行完了,但是没回到主函数就会崩溃。
图片说明

2个回答

oyljerry
oyljerry   Ds   Rxr 2016.03.02 17:45
已采纳

栈溢出等,子函数中堆栈被破坏了。多检查你的子函数代码

devmiao
devmiao   Ds   Rxr 2016.03.02 19:36
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于如何结束子程序并返回到主函数的问题
有的时候,我们会面临关于如何结束子程序并返回到主函数的问题,比如switch函数里的while循环内,我们需要从while循环退出到switch函数中, 如何解决这个问题呢,我们可以将switch函数作为一个菜单函数,当我们需要从while循环退出时,调用switch菜单函数,如: int main() { while(1) { menu(); } return 0; }
主函数调用子函数返回局部变量的问题及子函数的局部变量在函数结束后是否会销毁变量的内容
返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗?  返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题。 返回局部变量的引用也是绝对不可以的。 引用只是变量的一个别名,变量本体都不存在了,引用当然也没有任何意义。  还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以返
main函数结束后程序会怎样
本人之前一直是使用c/c++进行编程,现在转用java已经一年了,觉得这里面还是有很多使用上的不同。 C/C++ 每个c/c++代码有一个main函数,程序启动后,会开启一个主线程执行main函数,在main函数内部我们可以开启很多的线程,如果主函数main return的话,这些在main函数里开启的线程都会结束。 java java 也是一样,想要程序运行的话也必然会有一个ma
子函数的调用与返回,主函数获取返回值,函数工作路径
调用:call子函数 参数 返回:exit/b 返回值 返回值的获取:%errorlevel% 改变工作路径使用pushd [path] 恢复工作路径使用popd 例如: @echo off call :subfunc 100 echo %errorlevel% :eof   :subfunc setlocal enabledelayedexpansion for /L
求教关于被调函数中的malloc与free
问题:在子函数中动态分配内存:p=(int*)malloc(a*sizeof(int)),这个函数的目的是返回p:return(p) 我想问问,该在什么地方进行free(p)呢?如果在子函数中的return前free是肯定不行的,在之后free?子函数的return之后,不就结束函数调用了吗?那时候free还会被子函数执行吗?
c++中定义一个全局变量,子函数修改变量后,主函数没有改变问题
在子函数声明时加& 如 (int *&head);
被调用函数向调用函数返回值
被调用函数向调用函数返回值 一般使用return语句由被调用函数向调用函数返回值,该语句有下列用途: 1.它能立即从所在的函数中退出, 返回到调用它的程序中去。 2.返回一个值给调用它的函数。 有两种方法可以终止子函数运行并返回到调用它的函数中: 一是执行到函数的最后一条
讨论main函数执行结束后还能在执行一段代码吗?
今晚突然脑中出现了这个问题,于是通过查找一些资料来进行一下解答。 要实现这个功能就需要使用atexit()函数,乍一看似乎是和exit()函数有关系,所以我们就先来复习一下exit()函数。 exit(): 通常是用在子程序中用来终结程序用的,使用后程序自动结束,跳回操作系统。main函数结束时也会隐式地调用exit()函数。 原型:void exit(int state); sta
子函数内申请的空间传回主函数
这里要用到二级指针,或者是引用,不然值不能传回去! 要是直接用 void test(int* n); 那么子函数得到的是*n的副本,在函数内n指向的内同改变,但是这个值传不回主函数!     #include void test(int** n); int main() { int *n; test(&n); system("pause"); return
C语言中的子函数和主函数有什么联系啊?它们是怎么编写的?
 函数定义的一般形式1.无参函数的一般形式 类型说明符 函数名() { 类型说明 语句 }  其中类型说明符和函数名称为函数头。 类型说明符指明了本函数的类型,函数的类型实际上是函数返回值的类型。 该类型说明符与第二章介绍的各种说明符相同。 函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。{} 中的内容称为函数体。在函数体中也有类型说明, 这是对函数体内部所用到的变