Bagaimana kompiler mengisi nilai char array[100] = {0};
? Apa keajaiban di baliknya?
Saya ingin tahu bagaimana internal compiler diinisialisasi.
c++
c
compiler-construction
Namratha Patil
sumber
sumber
Jawaban:
Itu bukan sihir.
Perilaku kode ini dalam C dijelaskan pada bagian 6.7.8.21 dari spesifikasi C ( draf online spesifikasi C ): untuk elemen yang tidak memiliki nilai yang ditentukan, kompilator menginisialisasi pointer ke NULL dan tipe aritmatika menjadi nol ( dan secara rekursif menerapkan ini pada agregat).
Perilaku kode ini dalam C ++ dijelaskan pada bagian 8.5.1.7 dari spesifikasi C ++ ( draf online dari C ++ spec ): agregat kompilator-menginisialisasi elemen yang tidak memiliki nilai yang ditentukan.
Juga, perhatikan bahwa dalam C ++ (tetapi bukan C), Anda dapat menggunakan daftar penginisialisasi kosong, yang menyebabkan kompilator mengumpulkan-menginisialisasi semua elemen array:
Adapun jenis kode apa yang mungkin dihasilkan oleh kompiler ketika Anda melakukan ini, lihat pertanyaan ini: Strange assembly from array 0-initialization
sumber
Implementasi tergantung pada pengembang kompiler.
Jika pertanyaan Anda adalah "apa yang akan terjadi dengan deklarasi seperti itu" - kompiler akan menetapkan elemen array pertama ke nilai yang Anda berikan (0) dan semua yang lain akan ditetapkan ke nol karena itu adalah nilai default untuk elemen array yang dihilangkan.
sumber
Jika kompiler Anda adalah GCC, Anda juga dapat menggunakan sintaks berikut:
Silakan lihat http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits , dan perhatikan bahwa ini adalah fitur khusus kompiler .
sumber
Itu tergantung di mana Anda meletakkan inisialisasi ini.
Jika array statis seperti pada
maka itu adalah kompiler yang menyimpan 100 0 byte dalam segmen data program. Dalam hal ini Anda bisa menghilangkan penginisialisasi.
Jika array Anda otomatis, maka itu adalah cerita lain.
Dalam hal ini pada setiap panggilan fungsi foo Anda akan memiliki memset tersembunyi.
Kode di atas setara dengan
dan jika Anda menghilangkan initializer array Anda akan berisi data acak (data stack).
Jika array lokal Anda dinyatakan statis seperti di
maka secara teknis kasus yang sama dengan yang pertama.
sumber