C Tatasusunan Terikat sebagai Ungkapan Malar: Pengecualian dalam Kod
Dalam C , tatasusunan terikat lazimnya mestilah ungkapan tetap, memastikan bahawa saiz tatasusunan diketahui semasa penyusunan. Walau bagaimanapun, dalam kes tertentu, peraturan ini nampaknya dilanggar. Mari kita terokai contoh khusus:
#include <iostream> using namespace std; int main() { int n = 10; int a[n]; // Array a with size n for (int i = 0; i < n; i++) { a[i] = i + 1; cout << a[i] << endl; } return 0; }
Kod ini, apabila disusun menggunakan Xcode4 pada Mac, dilaksanakan tanpa sebarang ralat. Walaupun hakikat bahawa saiz tatasusunan a bukanlah ungkapan tetap, kod itu berfungsi.
Penjelasan: Tatasusunan Panjang Pembolehubah (VLA)
Sebab ini kod berfungsi adalah disebabkan oleh ciri yang dipanggil Variable-Length Arrays (VLA), yang diperkenalkan pada C99. VLA membenarkan saiz tatasusunan ditentukan semasa masa jalan, tidak seperti tatasusunan biasa yang saiznya mesti diketahui pada masa penyusunan.
Dalam kod yang disediakan, n bukan ungkapan tetap tetapi pembolehubah. Walau bagaimanapun, oleh kerana pengkompil dalam Xcode4 menyokong VLA, ia dapat memperuntukkan memori untuk tatasusunan a semasa masa jalan berdasarkan nilai n.
Peruntukan Tindanan lwn. Peruntukan Timbunan
Adalah penting untuk ambil perhatian bahawa VLA diperuntukkan pada tindanan, serupa dengan tatasusunan statik. Ini bermakna bahawa memori untuk tatasusunan diperuntukkan dan dibebaskan secara automatik apabila atur cara masuk dan keluar dari fungsi di mana VLA diisytiharkan. Tingkah laku ini berbeza daripada tatasusunan biasa yang diperuntukkan pada timbunan dan mesti diurus secara manual menggunakan penunjuk.
Atas ialah kandungan terperinci Mengapa Kod C Ini Disusun Walaupun Susunan Tidak Tetap Terikat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!