C语言 栈的问题 为什么在main函数下的第一while中要加这句“canf("%c",&ch);”没有这句会变死循环?不理解

作者&投稿:虫育 (若有异议请与网页底部的电邮联系)
跪求51单片机(c语言)高手解答,图中main函数最后一句的while(1)作何解释啊??理解不过来~

死循环,让程序始终执行这一条指令,而不是退出(有操作系统)或者继续往后执行未知的指令
时钟中断来了,就会到中断的响应函数执行,而中断执行完后,又会跑到while(1)继续死循环,等着下次中断的来临

main()函数称之为主函数,一个C程序总是从main()函数开始执行的,但是不一定在main函数最后结束。
在 main() 之后的最后一条语句结束后,程序还要运行一些代码,以正常返回操作系统。main函数执行完后还执行其他语句,
有时候需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理,方法就是用atexit()函数来注册程序正常终止时要被调用的函数,atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数,它的原型是:
int atexit(void (*)(void));

扩展资料
main函数的使用
示例:
#include
#include
void fn1(void);
void fn2(void);
int main(void)
{
atexit(fn1);
atexit(fn2);
printf("main exit ...
");
return 0;
}
void fn1()
{
printf("calling fn1()...
");
}
void fn2()
{
printf("calling fn2()...
");
}
参考资料来源:百度百科—main函数

在main函数中加入 scanf("%c",&ch);是为了使每次循环之后ch的值都会变化,当ch=='\n'时就会跳出循环;如果没有这句话,那么ch的值不会变化,就不能够跳出while循环,程序就进入里死循环。

当然会死循环了,要是没有接收字符的话,你看在压栈函数中相当于是申请了一个节点,在没有满的情况下,这就有了一个指针,如果没有接受scanf()中的赋值,指针就没有初始化,为NULL,使用野指针这是很危险的,再者说ch!=‘、n’不就是再次循环吗?

因为如果你没有那个scanf,怎么能让循环条件成立!?
比如你输入了一个字符a然后按回车,ch的值为a,然后进入第一个循环,如果里面没有scanf,
ch的值没有语句改变,循环条件永远为真


遂宁市15983483634: 关于c语言中的堆和栈到底是怎么回事?求大神说说 -
乐正以心脑: 首先你必须明白栈的工作原理,它的原理是先进后出(后进先出也可以),比如说现在有三个函数,1.main函数(这是必须有的)2.add()函数 3.sub()函数.main函数首先运行,首先他首先入栈,然后通过mian函数调用add()函数,接着...

遂宁市15983483634: hdoj ACM C语言中栈溢出和写在main函数内还是外有关系吗? -
乐正以心脑: 因为在函数内是放在栈里的,资源比较有限.如果开的数组比较大,得放在外面,这样就放在堆里的,就可以开得比较大.

遂宁市15983483634: c语言:函数调用时,栈的问题——(有请高手高手高高手) -
乐正以心脑: 必须出栈!aa 和 bb 和c 都是函数内部的局部变量,函数返回后就被释放,也就是在栈中没有了,返回后就剩下图中main()函数所对应的栈结构.栈只能够通过出栈来减少栈中数据的个数,从反面来讲,如果不出栈,funcA()函数返回后,栈指针还是指向c那,这肯定是不对的,因为函数返回后栈指针就得指向man()的栈结构了.

遂宁市15983483634: C语言栈的问题 老运行不出来 求解! -
乐正以心脑: #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct stack {int *base;int *top;int stacksize; }sqstack; void initstack(sqstack *s) {s->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));s->...

遂宁市15983483634: c语言栈的问题 -
乐正以心脑: while(a==0) 这个地方了,应该改为while(a!=0) while(s->top==-1) 这个地方也不对,改为while(s->top>-1) 修改过后的代码如下:#include <stdio.h>#include <stdlib.h> void main() { int a,b; typedef struct {int data[5]; int top;}SeqStack; SeqStack *s; ...

遂宁市15983483634: 关于 函数返回值储存和栈的问题 -
乐正以心脑: 栈也是内存,是内存就有地址,栈用主要用于函数调用时保存CPU寄存器状态压入函数调用参数和局部变量第一个问题,函数调用与执行时会用到栈,结束时将栈的内存地址(指针)返回没什么问题,主要是指针指向的是一个过期的地址,这个地址的数据可能在别的函数被调用时被意外的被更改,所以不要用指向局部变量的指针,有程序崩溃的危险性第二个问题 不见得申请一个局部变量就会压入堆栈,有些计算直接就在CPU寄存器里就完成了,并且虽说栈是后进先出但不是说访问栈非要从最后一个开始向前一个一个的访问,只要知道相对位置一样可以先读a 再读b 把程序写好,编译,对着汇编仔细对照吧

遂宁市15983483634: 关于C语言递归与系统栈的问题. -
乐正以心脑: C语言调用用函数时,由调用程序向栈中压入函数参数,最后再压入返回地址,后进入被调用函数,当被调用函数执行完成参考压入栈的返回地址回到调用程序.你写的那个程序就是 一直向栈中压入数据没有返回.这个栈的地址依赖于编译器和操作系统.不同的编译器和操作系统分给程序的地址和长度都可以不同.这个空间的分配在操作系统加载程序时分配,一般不可改变.所以上面的11243不能说明容量~~

遂宁市15983483634: 为什么每个C程序都需要一个叫做main的函数? -
乐正以心脑: 这是个有意思的问题.在 linux 里面,根据TIS 的ELF规范,一个可执行程序,也就是一个可执行的对象文件,它有一个程序进入点,这个进入点不是 我们写的 main 函数,而是位于 c 库中的 _start 汇编代码中.在这个汇编代码中,它会去调用我...

遂宁市15983483634: C语言栈方面,出现一些错误,栈定义有点问题,搞不太懂 -
乐正以心脑: C中不能在代码区定义变量,向前提一下就好了 int i,s,*e; SeqStack *S=(SeqStack*)malloc(sizeof(SeqStack)); //这样就可以了 e=&s; //这个下移

遂宁市15983483634: 关于C语言栈问题
乐正以心脑: C语言的栈是一种数据结构,没有固定的语法,只是,我们习惯用stack这样的标识符来表示栈,栈的特点是先进后出,最先入栈的数据最后才能出,我们在写关于栈的代码的时候,就得遵从这种规则.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网