#include #include #define smaller(a, b) ((a)>(b) ? (b) : (a))
#define min(a, b, c) smaller(smaller(a,b), c)
#define abs(x) ((x) < 0 ? -(x) : (x))
void test(int *p)
if(s == u)
else if(s == v)
else
}int a[100] = ;
int main(void)
以下是該程式作者的解釋:
利用各編譯器處理變數和動態記憶體分配的公共策略,那就是分塊處理,是最切實可行的辦法。相信有經驗的c/c++開發人員都不會否認以下事實:
1、編譯器總是把程式中的靜態變數集中分配在記憶體的低端,一般包括data區和bss區。data區集中存放已初始化的全域性變數。bss區集中存放未初始化的全域性變數,而且bss區在可執行檔案中只存放(相對)起始位址和長度資訊以節省外存空間,只有在裝入記憶體的時候才展開並全部初始化為0;
2、執行程序的位址空間布局:不考慮環境區、命令列引數以及**區,按位址從低到高依次為靜態區(包括data區和bss區)+ 堆 +棧。堆和棧共用程序的一大段高位址記憶體,分別用於存放程式動態分配的記憶體(比如malloc)和執行函式呼叫堆疊(其中包括當前函式的區域性變數,返回位址,一些儲存暫存器值等),但是堆的記憶體分配方式為為從低到高增長,而棧卻是從高到低增長。
有了這種分析之後,我們不難得出如下結論「因為各種記憶體,無論是靜態記憶體,動態分配的記憶體還是堆疊,它們分別都是成塊集中存放的,相互之間沒有交叉,所以對於任乙個給定的合法記憶體位址p來說,它和同類位址a1之間的距離與它和異類記憶體位址a2之間的距離相比,總有下式成立:
|p-a1| < |p-a2|.
有了這個結論,我們就可以認為設定三個分別位於靜態區、堆和棧中的變數,通過它們的位址分別與使用者傳入的位址(比如q)進行比較,其中離q最近的那個變數所在的區塊也就是q所在的區塊,以此判斷q是靜態分配的,動態分配的還是區域性陣列。
陣列的靜態分配和動態分配
原貼 1 在使用陣列前用new表示式動態分配陣列空間,new表示式在堆中分配空間,但是new之後還需delete,比較麻煩,初學者比較容易忘記,效率較低 而陣列的靜態分配,也就是在陣列宣告時直接在 中指定陣列的長度這種方式的記憶體實在棧上分配,在結束生命週期後自動釋放,效率相對較高,但是棧空間有限。...
靜態分配和動態分配
記憶體的靜態分配和動態分配的區別主要是兩個 一是時間不同。靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式 靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由函式malloc進行分配...
動態分配與靜態分配記憶體
記憶體的靜態分配和動態分配的區別主要是兩個 一是時間不同。靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式 靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由函式malloc進行分配...