百科问答小站 logo
百科问答小站 font logo



c++中能否判断一个指针指向栈还是堆? 第1页

  

user avatar   zhang-hao-72 网友的相关建议: 
      

gcc的话一般会默认生成几个符号,_stext, _etext, _sdata, _edata, _sbss, _ebss, _estack(不一定全都有), 具体的值在链接脚本里指定。所以指针地址和这几个符号比较一下就知道是不是在text/data/bss/stack了。

还有个_sidata, 这是rom里的data段首地址, 程序启动后, 进main函数之前, 会把从_sidata开始, 长度为_edata-_sdata的数据复制到_sdata, 也就是给程序里赋了初值的全局变量和静态变量初始化. bss则是没有赋过初值的全局和静态变量, 会被清零. 之后可能还有其他一些初始化操作, 再之后才是跳到main函数开始运行.

堆的话就比较麻烦了,看malloc具体实现,有可能是在data或bss上定义了一个大数组作为内存池给malloc用,这样的话指向堆里的指针同时也在data/bss里了。

一般情况,会有一个_sbrk符号,指向堆的结尾。malloc会通过系统调用brk和sbrk来设置堆,参考malloc的实现:

或者看看bget, 这是个比较简洁的第三方malloc:




  

相关话题

  C++ 运动完上一个函数到下一个函数时,上一个函数里的变量值(结构体变量)为什么没保留住,变成零了? 
  如果有一个按钮按下,世界上所有的c,c++,c#语言代码都无效,我们的生活会发生什么? 
  为什么好多人说C++代码丑? 
  为什么 C++ 中一个类的成员类型不能是该类本身,而 C# 中就可以? 
  野指针危害真的很大吗? 
  MFC、WTL、WPF、wxWidgets、Qt、GTK 各有什么特点? 
  C++函数收到一个指针T* ptr,没有其他信息,如何判断应该用delete还是delete[]? 
  现在快2022年了,c++为什么还要实现(.cpp)和声明(.h)分开? 
  c++如此繁琐,为什么大学不直接开展python课程? 
  如果有一个按钮按下,世界上所有的c,c++,c#语言代码都无效,我们的生活会发生什么? 

前一个讨论
求一副便宜的游戏耳机,大家有什么推荐吗?
下一个讨论
计算机网络中的路由器与家里用的路由器是一个概念么?





© 2025-03-28 - tinynew.org. All Rights Reserved.
© 2025-03-28 - tinynew.org. 保留所有权利