Jika saya memiliki sebuah struct seperti ini:
typedef struct
{
unsigned char c1;
unsigned char c2;
} myStruct;
Apa yang akan menjadi cara termudah untuk menginisialisasi ini struct ke 0? Akan berikut cukup?
myStruct _m1 = {0};
atau Akan aku harus secara eksplisit init masing-masing anggota untuk 0?
myStruct _m2 = {0,0};
Yang pertama adalah yang paling mudah(melibatkan kurang mengetik), dan hal ini dijamin untuk bekerja, semua anggota akan diatur ke 0
[Ref 1].
Yang kedua adalah lebih mudah dibaca.
Pilihan tergantung pada preferensi pengguna atau salah satu yang anda coding standar mandat.
[Ref 1] Referensi C99 Standar 6.7.8.21:
Jika ada sedikit penginisialisasi di brace-daftar tertutup dari elemen-elemen atau anggota dari suatu agregat, atau lebih sedikit karakter dalam sebuah string literal digunakan untuk menginisialisasi sebuah array dari ukuran yang dikenal dari ada elemen-elemen dalam array, sisanya dari agregat harus diinisialisasi secara implisit sama seperti benda-benda yang statis penyimpanan durasi.
Selamat Membaca: https://stackoverflow.com/questions/10828294/c-and-c-partial-initialization-of-automatic-structure
Jika data statis atau variabel global, itu adalah nol penuh secara default, jadi hanya menyatakan myStruct _m;
Jika data variabel lokal atau tumpukan dialokasikan zona, yang jelas dengan memset
seperti:
memset(&m, 0, sizeof(myStruct));
Saat ini compiler (misalnya versi terbaru dari gcc
) mengoptimalkan yang cukup baik dalam praktek. Ini bekerja hanya jika semua nilai nol (termasuk null pointer dan floating point zero) yang direpresentasikan sebagai semua bit nol yang berlaku pada semua platform yang saya tahu tentang (tapi C standar memungkinkan implementasi yang mana ini adalah palsu; aku tahu tidak ada seperti implementasi).
Anda mungkin bisa kode myStruct m = {};
atau myStruct m = {0};
(bahkan jika anggota pertama dari myStruct
tidak skalar).
Perasaan saya adalah bahwa dengan menggunakan memset
untuk struktur lokal adalah yang terbaik, dan ia menyampaikan baik fakta bahwa pada saat runtime, sesuatu yang harus dilakukan (sementara biasanya, global dan data statis dapat dipahami sebagai diinisialisasi pada waktu kompilasi, tanpa biaya apapun pada saat runtime).
Lihat §6.7.9 Inisialisasi:
21 Jika ada sedikit penginisialisasi di brace-daftar tertutup dari ada unsur-unsur atau anggota dari agregat, atau lebih sedikit karakter dalam sebuah string literal digunakan untuk menginisialisasi array dikenal ukuran dari ada elemen-elemen dalam array, sisanya dari agregat akan diinisialisasi secara implisit sama seperti benda-benda yang statis penyimpanan durasi.
Jadi, ya mereka berdua bekerja. Perhatikan bahwa dalam C99 cara baru inisialisasi, yang disebut tempat khusus inisialisasi dapat digunakan juga:
myStruct _m1 = {.c2 = 0, .c1 = 1};