Variabel Anda d
biasanya tidak muncul dari tumpukan. Kurung kurawal tidak menunjukkan bingkai tumpukan. Jika tidak, Anda tidak akan dapat melakukan hal seperti ini:
char var = getch();
{
char next_var = var + 1;
use_variable(next_char);
}
Jika kurung kurawal menyebabkan stack push / pop yang sebenarnya (seperti panggilan fungsi akan), maka kode di atas tidak akan dikompilasi karena kode di dalam kurung kurawal tidak akan dapat mengakses variabel var
yang hidup di luar kurung kurawal (sama seperti sub- fungsi tidak dapat langsung mengakses variabel dalam fungsi panggilan). Kita tahu ini bukan masalahnya.
Kurung kurawal hanya digunakan untuk pelingkupan. Kompiler akan memperlakukan setiap akses ke variabel "dalam" dari luar kurung kurawal sebagai tidak sah, dan mungkin menggunakan kembali memori itu untuk sesuatu yang lain (ini tergantung pada implementasi). Namun, itu mungkin tidak muncul dari tumpukan sampai fungsi penutup kembali.
Update: Inilah yang C spek katakan. Mengenai benda-benda dengan durasi penyimpanan otomatis (bagian 6.4.2):
Untuk objek yang tidak memiliki tipe array panjang variabel, masa pakainya diperpanjang dari entri ke dalam blok yang terkait dengan itu sampai pelaksanaan blok itu berakhir pula.
Bagian yang sama mendefinisikan istilah "seumur hidup" sebagai (penekanan milikku):
The seumur hidup dari sebuah objek adalah bagian dari pelaksanaan program selama penyimpanan dijamin akan disediakan untuk itu. Objek ada, memiliki alamat konstan, dan mempertahankan nilai yang terakhir disimpan sepanjang masa pakainya. Jika suatu benda disebut di luar masa hidupnya, perilaku itu tidak terdefinisi.
Kata kuncinya di sini adalah, tentu saja, 'dijamin'. Setelah Anda meninggalkan ruang lingkup set kawat gigi dalam, masa pakai array sudah berakhir. Penyimpanan mungkin atau mungkin masih belum dialokasikan untuk itu (kompiler Anda mungkin menggunakan kembali ruang untuk sesuatu yang lain), tetapi setiap upaya untuk mengakses array memicu perilaku yang tidak terdefinisi dan membawa hasil yang tidak terduga.
C spec tidak memiliki gagasan tentang stack frame. Itu hanya berbicara tentang bagaimana program yang dihasilkan akan berperilaku, dan meninggalkan detail implementasi ke kompiler (setelah semua, implementasi akan terlihat sangat berbeda pada CPU tanpa tumpukan dibandingkan pada CPU dengan tumpukan perangkat keras). Tidak ada dalam spesifikasi C yang mengamanatkan di mana frame stack akan atau tidak akan berakhir. Satu-satunya cara nyata untuk mengetahui adalah mengkompilasi kode pada kompiler / platform khusus Anda dan memeriksa rakitan yang dihasilkan. Pilihan optimisasi kompiler Anda saat ini kemungkinan juga akan berperan dalam hal ini.
Jika Anda ingin memastikan bahwa array d
tidak lagi menghabiskan memori saat kode Anda sedang berjalan, Anda dapat mengonversi kode dalam kurung kurawal menjadi fungsi terpisah atau secara eksplisit malloc
dan free
memori alih-alih menggunakan penyimpanan otomatis.