Jar*_*Par 32
一个不可移植或甚至保证可以工作的技巧是简单地将本地的地址打印出来作为指针.
void print_stack_pointer() {
void* p = NULL;
printf("%p", (void*)&p);
}
Run Code Online (Sandbox Code Playgroud)
这将基本上打印出其地址p是当前堆栈指针的良好近似值
due*_*l0r 21
没有可移植的方法来做到这一点.
如果你想要一个gcc/x86的解决方案,你可以使用这个:
// broken with clang, but usually works with GCC
register void *sp asm ("sp");
printf("%p", sp);
Run Code Online (Sandbox Code Playgroud)
除了duedl0r特别是GCC的答案之外,你可以使用__builtin_frame_address(0)GCC特定的(但不是x86特定的).
获取本地地址(如JaredPar回答)也是一种解决方案.
请注意,AFAIK C标准理论上不需要任何调用堆栈.
记住Appel的论文:垃圾收集比堆栈分配更快 ; 一个非常奇怪的C实现可以使用这种技术!但AFAIK它从未被用于C.
人们可以梦想其他技术.并且你可以分割堆栈(至少在最近的GCC上),在这种情况下,堆栈指针的概念具有更少的意义(因为那时堆栈不是连续的,并且可以由每个几个调用帧的许多段组成) .