Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-11-04 00:21:30
asal
892 orang telah melayarinya

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>
Salin selepas log masuk

Output untuk kod ini ialah:

7 4
7 8
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan