当程序编译链接成功之后,会产生可执行文件,当可执行文件执行的时候,系统将会从磁盘把文件加载到内存,代码加载到代码区,而这时的局部静态变量是加载到的数据区(data区),所以当执行完fun函数之后,虽然fun函数所占用的栈帧回收了,但是局部静态变量生存期并没有影响(静态变量是在系统进入到主函数时就被定义了)。所以最后输出*ip时的结果是10。
同样,定义了全局变量,也是存储在数据区,所以也可以返回。
所以,若要调用函数使用指针,并且想要不受影响,不能把块内(栈帧里)的某个变量的地址赋值给某个指针,并且在退出块之后(或者栈帧被回收之后)再次调用这个指针。也就是说被调用函数的形参传入的指针指向的地址必须是主函数内已定义的变量或者在静态储存区内的变量地址。