Un truco, que no es portátil o que ni siquiera se garantiza que funcione, es simplemente imprimir la dirección de un local como un puntero.
void print_stack_pointer() {
void* p = NULL;
printf("%p", (void*)&p);
}
Esto esencialmente imprimirá la dirección de p
que es una buena aproximación del puntero de pila actual
No existe una forma portátil de hacerlo.
En GNU C, esto puede funcionar para las ISA de destino que tienen un registro denominado SP, incluido x86, donde gcc reconoce "SP" como abreviatura de ESP o RSP.
// broken with clang, but usually works with GCC
register void *sp asm ("sp");
printf("%p", sp);
Este uso de variables de registro local ahora está obsoleto en GCC:
El único uso admitido para esta función es especificar registros para operandos de entrada y salida al llamar a Extended asm
Definir una variable de registro no reserva el registro. Excepto cuando se invoca el asm extendido, los contenidos del registro especificado no están garantizados. Por este motivo, los siguientes usos no se admiten explícitamente. Si parece que funcionan, es solo una casualidad , y puede dejar de funcionar según lo previsto debido a (aparentemente) cambios no relacionados en el código circundante, o incluso cambios menores en la optimización de una versión futura de gcc. ...
También se rompe en la práctica con clang donde sp
se trata como cualquier otra variable no inicializada.
Además de la respuesta de duedl0r con específicamente GCC podrías usar __builtin_frame_address(0)
que es específico de GCC (pero no x86 específico).
Esto también debería funcionar en Clang (pero hay algunos errores al respecto).
Tomar la dirección de un local (como respondió JaredPar) también es una solución.
Tenga en cuenta que AFAIK el estándar C no requiere ninguna pila de llamadas en teoría.
Uno podría soñar con otras técnicas. Y podría tener pilas divididas (al menos en GCC reciente), en cuyo caso la noción misma de puntero de pila tiene mucho menos sentido (porque entonces la pila no es contigua y podría estar formada por muchos segmentos de unos pocos marcos de llamada cada uno) .