Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `strlen()` dan `sizeof()` mengembalikan hasil yang berbeza untuk permulaan rentetan dalam C?

Mengapakah `strlen()` dan `sizeof()` mengembalikan hasil yang berbeza untuk permulaan rentetan dalam C?

DDD
DDDasal
2024-11-04 00:21:30820semak imbas

Why do `strlen()` and `sizeof()` return different results for string initialization in 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn