应该是 第一次调用 func1()之后 栈中存留了 12345,接着再调用 func2(),因为两个函数一样,所以栈分配的空间也一样,这样变量m使用的地址与 n一样,所以m=12345,
这个我认为不绝对
由于n是函数内的局部变量,当func1运行结束时,操作系统自动回收给n分配的内存空间,重新调度。这是代码正好在很短的时间内调用func2函数,申明局部变量m正好大小和n变量相同,操作系统的分配机制会将回收的n空间分配给m,使得即使m没有赋值,其分配的内存空间正好有之前n给赋值的数据。那为什麽m分配的空间正好是n之前的空间呢?那首先我们得认为给n分配空间的时候,操作系统是一种最有选择,那么在很短的时间内,电脑其它系统也没有空间释放,操作系统的内存分配机制仍旧认为n之前的空间是分配给整型的最优选择。
但如果短时间内正好有其它系统申请一个整型空间,有可能内存分配机制就把n的空间分配给别的系统了,所以并不绝对。因此大部分情况并不允许将函数内变量空间作为返回空间,因为可能被系统回收。但有时又不出现问题,因为接收代码立即使用这个内存的话,可能还没有被分配给其它系统,导致数据还在。
|xxxxxxx|
|xxxxxxx| <-main
|xxxxxxx|<-fun1
|123456|<--n
|xxxxxxx|
============================
|xxxxxxx|
|xxxxxxx| <-返回main
|xxxxxxx|
|123456|
|xxxxxxx|
==============================
|xxxxxxx|
|xxxxxxx| <-main
|xxxxxxx|<-再次调用func2
|123456|<-m
|xxxxxxx|