Rumah > Artikel > pembangunan bahagian belakang > Mengapakah `strlen()` dan `sizeof()` mengembalikan hasil yang berbeza untuk permulaan rentetan dalam C?
Memahami Percanggahan dalam strlen() dan sizeof() Keputusan untuk String Initialization
Dalam pengaturcaraan C, selalunya terdapat percanggahan antara keputusan strlen() dan sizeof() apabila berurusan dengan penunjuk dan tatasusunan yang dimulakan kepada rentetan. Tingkah laku yang kelihatan bercanggah ini boleh dijelaskan dengan memahami sifat penunjuk dan tatasusunan.
Pertimbangkan contoh kod yang disediakan:
<code class="c">char *str1 = "Sanjeev"; char str2[] = "Sanjeev"; printf("%d %d\n", strlen(str1), sizeof(str1)); printf("%d %d\n", strlen(str2), sizeof(str2));</code>
Output untuk kod ini ialah:
7 4 7 8
Keputusan yang berbeza untuk strlen() dan sizeof() berpunca daripada fakta bahawa str1 ialah penunjuk kepada rentetan manakala str2 ialah susunan aksara.
Sizeof() vs. Strlen( ) untuk Penunjuk
sizeof() menentukan saiz jenis data dalam bait. Dalam kes penunjuk char, seperti str1, sizeof mengembalikan 4 pada sistem 32-bit (8 pada sistem 64-bit) kerana penunjuk mengambil 4 (atau 8) bait memori. Walau bagaimanapun, strlen mengembalikan panjang rentetan yang ditunjuk oleh penunjuk aksara. Memandangkan rentetan "Sanjeev" mempunyai 7 aksara, strlen mengembalikan 7.
Sizeof() vs. Strlen() for Arrays
Sebaliknya, str2 ialah susunan watak. sizeof(str2) mengembalikan saiz keseluruhan tatasusunan, yang merangkumi kedua-dua aksara dan null-terminator (ditambah secara automatik pada semua rentetan C). Oleh itu, sizeof(str2) mengembalikan 8 (bilangan aksara dalam "Sanjeev" ditambah dengan penamat nol). strlen(str2) juga mengembalikan 7, iaitu panjang rentetan tidak termasuk null-terminator.
Pertimbangan Tambahan
Untuk menggambarkan lagi perbezaan, pertimbangkan perkara berikut kod:
<code class="c">char str2[8]; strncpy(str2, "Sanjeev", 7); char *str1 = str2; printf("%d %d\n", strlen(str1), sizeof(str1)); printf("%d %d\n", strlen(str2), sizeof(str2));</code>
Dalam kes ini, str1 kini ialah penunjuk yang menunjuk ke permulaan tatasusunan aksara str2. Seperti sebelum ini, strlen(str1) mengembalikan 7 dan sizeof(str1) mengembalikan 4. Walau bagaimanapun, strlen(str2) juga mengembalikan 7, manakala sizeof(str2) masih mengembalikan 8. Ini kerana str2 kekal sebagai tatasusunan dan saiz tatasusunan ditentukan oleh bilangan elemen yang terkandung di dalamnya, tidak kira sama ada ia benar-benar digunakan.
Atas ialah kandungan terperinci Mengapakah `strlen()` dan `sizeof()` mengembalikan hasil yang berbeza untuk permulaan rentetan dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!