Bagaimana kompiler mengisi nilai char array[100] = {0};
? Apa keajaiban di baliknya?
Saya ingin tahu bagaimana internal compiler diinisialisasi.
Bagaimana kompiler mengisi nilai char array[100] = {0};
? Apa keajaiban di baliknya?
Saya ingin tahu bagaimana internal compiler diinisialisasi.
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:
char array[100] = {};
Adapun jenis kode apa yang mungkin dihasilkan oleh kompiler ketika Anda melakukan ini, lihat pertanyaan ini: Strange assembly from array 0-initialization
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.
Jika kompiler Anda adalah GCC, Anda juga dapat menggunakan sintaks berikut:
int array[256] = {[0 ... 255] = 0};
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 .
Itu tergantung di mana Anda meletakkan inisialisasi ini.
Jika array statis seperti pada
char array[100] = {0};
int main(void)
{
...
}
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.
int foo(void)
{
char array[100] = {0};
...
}
Dalam hal ini pada setiap panggilan fungsi foo Anda akan memiliki memset tersembunyi.
Kode di atas setara dengan
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
dan jika Anda menghilangkan initializer array Anda akan berisi data acak (data stack).
Jika array lokal Anda dinyatakan statis seperti di
int foo(void)
{
static char array[100] = {0};
...
}
maka secara teknis kasus yang sama dengan yang pertama.