c - 如何检测程序虚拟空间中的栈顶

标签 c memory-management stack

我正在尝试估计程序堆栈范围的跨度。我的策略是假设由于堆栈向下增长,我可以为当前堆栈帧创建一个局部变量,然后使用其地址作为引用。

 int main()
 {
   //Now we are in the main frame.
   //Define a local variable which would be lying in the top of the stack
    char a;
   //Now define another variable
    int b; //address should be lower assuming stack grows downwards

   //Now estimate the stack size by rlimit
   struct rlimit stack_size;
   getrlimit(RLIMIT_STACK,&stack_size);

   //A crude estimate would be stack goes from &a to &a - stack_size.rlim_cur

   printf("%p \n",&a);
   printf("%p \n",&b);
   printf("stack spans from %u to %u",&a,&a - stack_size.rlim_cur);
   return 0;
 }

有趣的是,当我使用gdb调试a和b的值地址时,b的地址具有比a更高的值。此外,堆栈指针始终保持在 .

 0xbfca65f4 
 0xbfca660f
 Stack spans from 0xbfca65f4 to 0xbbca65f4.

 ebx            0xb7faeff4  -1208291340
 esp            0xbffff670  0xbffff670

有人可以帮我理解我哪里出了问题吗? 提前致谢!

最佳答案

这种方法大多有效;您的错误只是在同一调用框架中检查 ab 。编译器没有理由按照您在堆栈上期望的方式对自动变量进行排序;它可能会出于数据局部性或对齐目的选择它们的顺序。

如果您比较 main 中的一个自动对象的地址和单独调用框架中的另一个自动对象的地址(确保它不会内联到 main 中!),那么您应该得到更接近您期望的结果。

关于c - 如何检测程序虚拟空间中的栈顶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14617515/

相关文章:

c - 精心创建的结构抛出 "dereferencing pointer to incomplete type"错误

c - 指向二维数组的指针在底层是如何工作的?

c - _mm_shuffle_ps() 等价于整数 vector (__m128i)?

c - C 中的列表按字母顺序排列,额外输入

javascript - JavaScript 如何知道 Promises 回调函数何时准备好执行?

java - 尝试在 java 中使用递归创建指数计算器时出现堆栈溢出错误

java - 堆栈是从 0 开始还是从 1 开始?

java - Java 中的清除 protected 双向链表

PHP 工作代码出现奇怪的问题

c++ - 如何阻止这种内存泄漏