如何判断数组是静态还是动态分配的
生活随笔
收集整理的這篇文章主要介紹了
如何判断数组是静态还是动态分配的
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <stdio.h>
#include <stdlib.h>#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)
{int x; static int y = 1; static int *q = (int *)malloc(sizeof(int)); unsigned int u = ABS((unsigned int)q-(unsigned int)p); unsigned int v = ABS((unsigned int)&x-(unsigned int)p); unsigned int w = ABS((unsigned int)&y-(unsigned int)p); unsigned int s = MIN(u, v, w); if(p == NULL) {printf("test() in file %s: NULL pointer parameter. ", __FILE__);return ;}if(s == u) {printf("p located in heap. "); }else if(s == v){printf("p located in stack. "); }else{printf("p located in data section. "); }}int a[100] = {1}; int main(void)
{int *b = (int *)malloc(100);int c[100];test(a); test(b); test(c); free(b); return 0;
}
以下是該程序作者的解釋:
利用各編譯器處理變量和動態內存分配的公共策略,那就是分塊處理,是最切實可行的辦法。相信有經驗的C/C++開發人員都不會否認以下事實:
? ??1、編譯器總是把程序中的靜態變量集中分配在內存的低端,一般包括DATA區和BSS區。DATA區集中存放已初始化的全局變量。BSS區集中存放未初始化的全局變量,而且BSS區在可執行文件中只存放(相對)起始地址和長度信息以節省外存空間,只有在裝入內存的時候才展開并全部初始化為0;
???2、運行進程的地址空間布局:不考慮環境區、命令行參數以及代碼區,按地址從低到高依次為靜態區(包括DATA區和BSS區)+ 堆 +棧。堆和棧共用進程的一大段高地址內存,分別用于存放程序動態分配的內存(比如malloc)和運行函數調用堆棧(其中包括當前函數的局部變量,返回地址,一些保存寄存器值等),但是堆的內存分配方式為為從低到高增長,而棧卻是從高到低增長。
???有了這種分析之后,我們不難得出如下結論“因為各種內存,無論是靜態內存,動態分配的內存還是堆棧,它們分別都是成塊集中存放的,相互之間沒有交叉,所以對于任一個給定的合法內存地址p來說,它和同類地址a1之間的距離與它和異類內存地址a2之間的距離相比,總有下式成立:
??????????????|p-a1| < |p-a2|.
???有了這個結論,我們就可以認為設置三個分別位于靜態區、堆和棧中的變量,通過它們的地址分別與用戶傳入的地址(比如q)進行比較,其中離q最近的那個變量所在的區塊也就是q所在的區塊,以此判斷q是靜態分配的,動態分配的還是局部數組。
http://blog.sina.com.cn/s/blog_73b3cd8c0100paf5.html
以下是該程序作者的解釋:
利用各編譯器處理變量和動態內存分配的公共策略,那就是分塊處理,是最切實可行的辦法。相信有經驗的C/C++開發人員都不會否認以下事實:
? ??1、編譯器總是把程序中的靜態變量集中分配在內存的低端,一般包括DATA區和BSS區。DATA區集中存放已初始化的全局變量。BSS區集中存放未初始化的全局變量,而且BSS區在可執行文件中只存放(相對)起始地址和長度信息以節省外存空間,只有在裝入內存的時候才展開并全部初始化為0;
???2、運行進程的地址空間布局:不考慮環境區、命令行參數以及代碼區,按地址從低到高依次為靜態區(包括DATA區和BSS區)+ 堆 +棧。堆和棧共用進程的一大段高地址內存,分別用于存放程序動態分配的內存(比如malloc)和運行函數調用堆棧(其中包括當前函數的局部變量,返回地址,一些保存寄存器值等),但是堆的內存分配方式為為從低到高增長,而棧卻是從高到低增長。
???有了這種分析之后,我們不難得出如下結論“因為各種內存,無論是靜態內存,動態分配的內存還是堆棧,它們分別都是成塊集中存放的,相互之間沒有交叉,所以對于任一個給定的合法內存地址p來說,它和同類地址a1之間的距離與它和異類內存地址a2之間的距離相比,總有下式成立:
??????????????|p-a1| < |p-a2|.
???有了這個結論,我們就可以認為設置三個分別位于靜態區、堆和棧中的變量,通過它們的地址分別與用戶傳入的地址(比如q)進行比較,其中離q最近的那個變量所在的區塊也就是q所在的區塊,以此判斷q是靜態分配的,動態分配的還是局部數組。
http://blog.sina.com.cn/s/blog_73b3cd8c0100paf5.html
總結
以上是生活随笔為你收集整理的如何判断数组是静态还是动态分配的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取系统进程信息和进程依赖的dll信息-
- 下一篇: RtlAdjustPrivilege 一