1. 局部變數是存放在棧中,還是存放在堆棧中
你好!
程序中的局部變數存放在棧中,因而不能太大,如:
double
a[1000][1000];就可能不能通過編譯。用戶動態分配的內存,分配於堆中,可以很大。如
double
**a
=
new
double
*[1000];
for(int
i
=
0;
i
<
1000;
++i)
a[i]
=
new
double
[1000];
希望對你有所幫助,望採納。
2. Keil for C51函數調用後其局部變數不會放到棧中,那定義的變數是不是就類似於靜態變數了
如果變數在函數外部 或者函數內部用static修飾,那變數屬於靜態存儲,編譯的時候就已經分配好空間了,有初始值,類似於靜態變數
3. 單片機全局變數 局部變數 堆與棧 的區別
你理解的基本正確!
局部變數空間,就是堆棧空間,也就是棧空間。
從局部變數聲明的時候,它就在堆棧空間了,而不是調用函數的時候,才讓它入棧的。
堆和棧是兩碼事情,通常我們所說的堆棧,是指棧。
堆,是一種結構,是從全局區,分配一段區間,然後由一種內存分配演算法進行管理。
另外,還有一個區,是常量區。
4. 單片機C語言在聲明變數默認放在DATA區嗎,就是堆棧區,是不是全局變數局部變數都在
一般情況下定義的變數都是data 區的,你也可以在定義變數時在全面加上關鍵詞,把變數定義到不同的區域里。。。當片內地址空間用完時,還可以定義片外的地址。。。現在很多單片機內部都集成有片外的存儲區。。。有關的關鍵字你可以參考下面這位大神總結的。。。。。
http://blog.csdn.net/dashon2011/article/details/6929647
5. 關於單片機在調用子程序時,進行了怎樣的堆棧操作
「斷點的PC值入棧,還有哪些東西呢?」
取決於子程序的類型和編程方式。有些特殊類型的子程序是需要入棧的,若採用高級語言編程則編譯器會自動添加相應的入棧出棧語句。
「有人說臨時變數不入棧,那CPU從子程序運行退回斷點時,臨時變數的值是如何恢復的呢?」
呵呵,為何要恢復?調用子程序的時候會從局部變數塊中新分配空間的,如同你後半部分所說。
6. 為什麼方法中的局部變數使用final修飾後,放在堆中,而不是棧中
老兄,我也不民懂,查了一下,final修飾的變數變了常量
棧中只放臨時動態的變數,
堆中放長久動態的變數,
我想所有常量是放全局變數區域里。不是堆也不是棧,可能看起來像堆
7. 棧用來調用函數時保護斷點,局部變數為什麼也入棧
局部變數壓在棧里,是為了釋放更多的寄存器,可以靈活得使用寄存器實現具體運算。當運算不需要引用局部變數的時候,局部變數就在棧里,當運算需要局部變數的時候,就從棧里取出局部變數的值到寄存器里。
局部變數也常駐寄存器,就是在定義局部變數的時候加register修飾。
棧有個棧頂指針寄存器SP,壓棧的時候,可以通過SP進行一定的偏移(這些偏移量在編譯的時候就已經確定下來了,不會在運行的時候找不到)來得到某個局部變數存放的位置,從而從這個位置讀取局部變數的值,並不要通過出棧操作來獲取他們的值。