#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

如何判断数组是静态还是动态分配的相关推荐

  1. 【C++】细说C++中的数组之“静态”数组

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 数组是C/C++以及各种编程语言中最常用的一种数据结构,了解数组的性质并且学会使用数组 ...

  2. php判断数组是否存在字符串中,php判断数组元素中是否存在某个字符串的方法

    今天在写一个函数的时候,需要用到判断数组中是否存在某个字符串,方便我们继续后面的操作,这里简单为大家介绍下,需要的朋友可以参考下 方法一:采用in_array(value,array,type) ty ...

  3. C语言判断数组中是否存在该数

    C语言判断数组中是否存在该数 #include<stdio.h> int main() {int query(int a[10],int num);int num;printf(" ...

  4. c语言如何判断数组不为空,PHP 判断数组是否为空的几种方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在php中判断是否为数组很简单,php中利用is_array() 函数就可以快速判断变量是否为数组了.is_array - 检测变量是否是数组Report ...

  5. PHP 通过数组判断数组顺序输出是否是二叉排序树的后序遍历结果

    1 <?php 2 #通过数组判断该数组顺序输出是否是二叉树后序遍历结果 3 4 #@param a 待判断数组 5 #@param s 待判断开始部分 6 #@param e 待判断结束部分 ...

  6. JS的表单序列化,数组去重,判断数组是否重复等方法

    一.背景 本篇主要是记录一下JS中常用的工具方法.包括表单序列化,判断数组是否重复,数组去重等.做个笔记 二.工具方法 1.表单元素序列化为对象 public function serializeOb ...

  7. java 数组 包含_Java中高效的判断数组中某个元素是否存在详解

    一.检查数组是否包含某个值的方法 使用List public static boolean useList(String[] arr, String targetValue) { return Arr ...

  8. 在Java中如何高效的判断数组中是否包含某个元素

    如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...

  9. asp 判断数组等于_剑指Offer(牛客版)--面试题4:二维数组中的查找

    SCDN博客:https://blog.csdn.net/weixin_41923658 微信公众号:「汤姆鱼」 -------------------------------------手动分割线- ...

最新文章

  1. js / jquery 零散收集
  2. 全球知名物联网研究机构预测:2016物联网发展形势
  3. 将war包发布到测试服的常用命令
  4. 2021 大厂实习笔试
  5. 用户账号系统(python)
  6. bcache使用教程
  7. python中如何快速注释_python中如何快捷添加注释
  8. This关键字的一些更新的理解
  9. 在某龙芯平台上编译FFMPEG报错:ERROR: xxx not found using pkg-config
  10. Selenium自动化测试——计算器加法测试
  11. python解数独--世界最难数独2.3秒完成_【数独】世界最难数独90+毫秒解决。一个不错的算法...
  12. 同济大学Openwrt路由器 ipv6教程(新手导向)
  13. PostMan 快快走开, ApiFox 来了, ApiFox 强大的Api调用工具
  14. Java学习笔记001_概述及环境搭载
  15. 入门:链表的基本操作
  16. 主板的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. 我的年假2016-2017
  18. Pi-puck的ROS开发之路
  19. 《高频电子线路》课程参考文献
  20. python爬取微博动态页面id、内容、评论点赞数存入MongoDB 详解

热门文章

  1. 雾霾入侵机房会产生哪些危害?该如何防护?
  2. ensp启动设备蓝屏_为什么早期的Windows经常死机蓝屏,现在却很少发生?这些你都知道吗?...
  3. 连接myeclipse和mysql数据库,MyEclipse与Mysql数据库的连接
  4. 成功解决AttributeError: ‘PathCollection‘ object has no property ‘n_levels‘
  5. Dataset之Cityscapes:Cityscapes数据集的简介、安装、使用方法之详细攻略
  6. VS Code:史上最全的VS Code快捷键+分门别类(中英文对照版)
  7. Crawler:基于BeautifulSoup库+requests库实现爬取2018最新电影《后来的我们》热门短评
  8. java.nio.file.NoSuchFileException
  9. P1433 吃奶酪 回溯法 优化
  10. ThreadFactory