楼主对照这个理解下~
void main() { int a[1024]={0.0};//在栈里 processing(); //processing()中的int b[1024]被回收了,因为int b没有在作用域中具有生命周期了 } //程序在此运行结束,int a[1024]={0.0};也被回收 void processing(void) { int b[1024]={0.0};//也在栈里}
}
不是
在这个栈被用完之后这些空间就会被释放,不过对于编译器来说,它会让汇编语言自动保留一个区域的堆栈空间,这个空间会被永久占用,这是为了防止堆栈区被占用导致的错误
您宣告就會佔用了,但在51會有比較特殊的Memory management,叫做data overlaying
所以實際上是會重疊在一起但不會影響使用,這編譯器會為您做好這件事,可參考以下說明
所謂 data overlaying 是指沒有呼叫關係的函數,它們的區域變數區可以重疊在一起(共用一塊記憶體)。Keil C51 會分析程式中函數間呼叫的關係,產生一個呼叫樹。它就根據這個呼叫樹來決定那些函數的區域變數區可以 overlaying 在一起。
以上供參考
在主函数里面应该不会释放的
这用法我也是醉了,aaa bbb这样的名字多好。
这个局部buf,你看他是个名字跟main函数的buf一样的数组。在电脑眼里却只是个地址,而且此buf的地址不是彼buf的地址。
人类的思维可能不好理解。但是对电脑来说很简单。虽然变量名一样了,但一个只是在函数里面局部的,在它眼里,这是两个不同的地址。
fn函数的局部buf,按你给的代码就是512个u8类型。
当进入fn这个函数的时候,会用掉512个u8,执行完就释放了。
word天啊,我的大脑已经短路了。
为什么不是u8 aaa[512]啊!!!