Saya tidak yakin apa yang akan ada di array karakter setelah inisialisasi dengan cara berikut.
1. char buf[10] = "";
2. char buf[10] = " ";
3.char buf[10] = "a";
Untuk kasus 2, saya pikir buf[0]
harus ' '
, buf[1]
harus '\0'
, dan dari buf[2]
ke buf[9]
akan menjadi konten acak. Untuk kasus 3, menurut saya buf[0]
seharusnya 'a'
, buf[1]
harus '\ 0', dan dari buf[2]
hingga buf[9]
akan menjadi konten acak.
Apakah itu benar?
Dan untuk kasus 1, apa yang akan ada di buf
? buf[0] == '\0'
dan dari buf[1]
sampai buf[9]
akan menjadi konten acak?
char buf[10]; buf = "a";
tidak dapat dikompilasi. - Silakan coba dulu, lalu salin / tempel kode Anda yang sebenarnya ke dalam pertanyaan. Itu menghemat banyak pekerjaan untuk Anda dan untuk semua pembaca pertanyaan Anda.Jawaban:
Ini bukan cara Anda menginisialisasi array, tetapi untuk:
Deklarasi pertama:
setara dengan
Deklarasi kedua:
setara dengan
Deklarasi ketiga:
setara dengan
Seperti yang Anda lihat, tidak ada konten acak: jika ada lebih sedikit penginisialisasi, sisa larik diinisialisasi dengan
0
. Ini terjadi bahkan jika array dideklarasikan di dalam suatu fungsi.sumber
char
.0
dan'\0
memiliki nilai yang sama.char buff[3] = "abcdefghijkl";
tidak valid.char p3[5] = "String";
juga tidak valid.char p[6] = "String";
valid dan sama denganchar p[6] = {'S', 't', 'r', 'i', 'n', 'g'};
.Sunting: OP (atau editor) diam-diam mengubah beberapa tanda kutip tunggal dalam pertanyaan awal menjadi tanda kutip ganda di beberapa titik setelah saya memberikan jawaban ini.
Kode Anda akan menghasilkan kesalahan kompiler. Fragmen kode pertama Anda:
adalah ilegal ganda. Pertama, di C, tidak ada yang namanya kosong
char
. Anda dapat menggunakan tanda kutip ganda untuk menunjukkan string kosong, seperti:Itu akan memberi Anda penunjuk ke
NUL
string, yaitu, string satu karakter dengan hanyaNUL
karakter di dalamnya. Tetapi Anda tidak dapat menggunakan tanda kutip tunggal dengan tidak ada isinya - itu tidak ditentukan. Jika Anda perlu menentukanNUL
karakter, Anda harus menentukannya:Garis miring terbalik diperlukan untuk membedakan karakter
'0'
.menyelesaikan hal yang sama, tetapi yang pertama agak kurang ambigu untuk dibaca, saya kira.
Kedua, Anda tidak dapat menginisialisasi array setelah didefinisikan.
mendeklarasikan dan mendefinisikan array. Pengenal array
buf
sekarang menjadi alamat di memori, dan Anda tidak dapat mengubah di manabuf
titik melalui tugas. Begituilegal. Fragmen kode kedua dan ketiga Anda ilegal karena alasan ini.
Untuk menginisialisasi sebuah array, Anda harus melakukannya pada saat mendefinisikan:
akan memberi Anda array 10 karakter dengan karakter pertama adalah spasi
'\040'
dan karakter lainnyaNUL
, yaitu'\0'
. Ketika sebuah array dideklarasikan dan didefinisikan dengan penginisialisasi, elemen array (jika ada) melewati yang dengan nilai awal yang ditentukan secara otomatis diisi0
. Tidak akan ada "konten acak".Jika Anda mendeklarasikan dan mendefinisikan array tetapi tidak menginisialisasinya, seperti berikut ini:
Anda akan memiliki konten acak di semua elemen.
sumber
Ini setara
Ini setara
Ini setara
sumber
Bagian yang relevan dari draft standar C11 n1570 6.7.9 inisialisasi mengatakan:
dan
Jadi, '\ 0' ditambahkan, jika ada cukup ruang , dan karakter yang tersisa diinisialisasi dengan nilai yang
static char c;
akan diinisialisasi dalam suatu fungsi.Akhirnya,
Jadi,
char
sebagai tipe aritmatika, sisa dari array juga dijamin akan diinisialisasi dengan nol.sumber
Yang cukup menarik, adalah mungkin untuk menginisialisasi array dengan cara apapun dan kapanpun dalam program, asalkan mereka adalah anggota dari
struct
atauunion
.Contoh program:
sumber
Saya tidak yakin tetapi saya biasanya menginisialisasi sebuah array ke "" dalam hal ini saya tidak perlu khawatir tentang akhir null dari string.
sumber
main()
(dan Anda juga harus menggunakanvoid
, yaitu,int main(void) { ... }
. C99 menyingkirkan aturan ini, sehingga kode ini tidak dapat dikompilasi untuk C99 dan kemudian. Hal lain yang perlu diperhatikan di sini adalah bahwa mulai dengan C99, jika Anda menghilangkanreturn
di main, ada otomatisreturn 0;
ditempatkan / tersirat sebelum}
di ujung utama. Anda menggunakan aturan int implisit yang hanya bekerja sebelum C99, namun Anda menggunakan implisitreturn
yang hanya bekerja dengan C99 dan yang lebih baru ; keduanya jelas kontradiktif .