Goto语句,完成函数体内部进行跳转,首先不提倡用,但是当发生错误时的跳转还有有必要的。
但是,我也有在想,那它可以在不同的函数之间跳转吗?当然不可以,那WHO可以呢?
#include<setjmp.h>
Intsetjmp(jmp_buf env);
Intlongjmp(jmp_buf env,int val);
第一次看到这个东西,我快疯了,这是个什么东东。
那是因为,我对函数调用的“栈帧”概念不明白具体是什么所导致的!
现在如果一个程序中包含(很)深层次的函数调用时,从MAIN进入开始就在开栈,而这个栈就会在内存中开辟栈帧(自然会是使用首地址),接着后面的每个函数调用,都会像MAIN一样,形成在内存中的很多栈帧。
Setjmp和longjmp会配合使用,当调用到longjmp,它会返回到setjmp调用的位置,这时候在内存中会将除调用setjmp层函数栈外,其他函数栈帧清空。好了,现在出现很多问题了。
我们调用的函数中,会使用到自动变量,当然这些自动变量的存储只是在每个函数的栈帧中,那如果这个栈帧由于函数的跳转在内存中被清空了,那这些自动变量假设由于某种需求被改变了怎么办?它是继续使用之前的值还是改变之后的呢?!
好吧,现在如果不想使自动变量的值回滚,那就请用volative修饰下吧,告诉“那个谁”我喜欢最新的值(我是一个喜新厌旧的人)。
另外,问题还有一个问题,声明自动变量的函数已经返回,那就不能去引用这些自动变量,那我们就没有办法治它了?有啊,可以有全局存储空间静态地(static、extern修饰)或动态地(前提是数组,使用malloc、calloc、realloc)为其分配空间。