Salah satu trik, yang tidak portabel atau bahkan dijamin berhasil, adalah dengan mencetak alamat lokal sebagai pointer.
void print_stack_pointer() {
void* p = NULL;
printf("%p", (void*)&p);
}
Ini pada dasarnya akan mencetak alamat p
yang merupakan perkiraan yang baik dari penunjuk tumpukan saat ini
Tidak ada cara portabel untuk melakukannya.
Di GNU C, ini mungkin berfungsi untuk ISA target yang memiliki register bernama SP, termasuk x86 di mana gcc mengenali "SP" sebagai kependekan dari ESP atau RSP.
// broken with clang, but usually works with GCC
register void *sp asm ("sp");
printf("%p", sp);
Penggunaan variabel register lokal ini sekarang tidak digunakan lagi oleh GCC:
Satu-satunya penggunaan yang didukung untuk fitur ini adalah untuk menentukan register untuk operan input dan output saat memanggil Extended asm
Mendefinisikan variabel register tidak mencadangkan register. Selain saat menjalankan Extended asm, isi register yang ditentukan tidak dijamin. Untuk alasan ini, penggunaan berikut secara eksplisit tidak didukung. Jika tampaknya berhasil, itu hanya kebetulan , dan mungkin berhenti berfungsi sebagaimana dimaksud karena (tampaknya) perubahan yang tidak terkait pada kode sekitarnya, atau bahkan perubahan kecil dalam pengoptimalan versi gcc yang akan datang. ...
Ini juga rusak dalam praktiknya dengan dentang di mana sp
diperlakukan seperti variabel lain yang tidak diinisialisasi.
Selain jawaban duedl0r dengan GCC khusus Anda bisa menggunakan __builtin_frame_address(0)
yang spesifik untuk GCC (namun bukan x86 spesifik).
Ini juga harus bekerja pada Dentang (tetapi ada beberapa bug tentangnya).
Mengambil alamat lokal (seperti yang dijawab JaredPar) juga merupakan solusi.
Perhatikan bahwa AFAIK standar C tidak memerlukan tumpukan panggilan apa pun secara teori.
Orang bisa memimpikan teknik lain. Dan Anda dapat membagi tumpukan (setidaknya pada GCC baru-baru ini), dalam hal ini gagasan tentang penunjuk tumpukan kurang masuk akal (karena tumpukan tidak bersebelahan, dan dapat dibuat dari banyak segmen dari beberapa bingkai panggilan masing-masing) .