如何判断数组是静态还是动态分配的
2014-08-23 17:28
295 查看
#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++中关于[]静态数组和new分配的动态数组的区别分析
- C语言中动态分配数组指针后如何释放
- 数组的静态分配和动态分配
- 编写一个函数,从标准输入读取一列整数,把这些值存储于一个动态分配的数组中并返回这个数组。函数通过观察EOF判断输入列表是否结束。数组的第一个数是数组包含的值的个数,他的后面就是这些整数值。
- 关于[]静态数组和new分配的动态数…(转)
- 能否判断动态数组有没有被分配过?
- 如何区分一个初始化参数是静态还是动态的
- 关于[]静态数组和new分配的动态数…
- 我该如何动态分配多维数组?
- 如何动态分配多维数组
- 如何判断网站是伪静态还是真静态
- 如何判断数组是一维还是二维
- Javascript如何判断一个变量是普通变量还是数组还是对象?
- 编写一个函数,从标准输入读取一列整数, 把这些值存储在一个动态分配的数组中并返回这个数组。 函数通过观察EOF判断输入列表是否结束。 数组的第一个数是数组包含的值的个数, 它的后面就是这些整数值。
- C++中关于[]静态数组和new分配的动态数组的区别分析
- malloc动态分配与数组静态分配的区别: