Mengapakah `strlen` dan `sizeof` menghasilkan hasil yang berbeza untuk rentetan berasaskan penunjuk dan berasaskan tatasusunan dalam C?

Patricia Arquette
Lepaskan: 2024-11-02 06:37:02
asal
185 orang telah melayarinya

Why do `strlen` and `sizeof` produce different results for pointer-based and array-based strings in C?

Keluaran Berbeza dalam Pengiraan Panjang Rentetan dan Saiz untuk Permulaan Rentetan Berasaskan Penunjuk dan Tatasusunan

Memahami Keputusan

Apabila mencipta rentetan berasaskan penunjuk str1 dan rentetan berasaskan tatasusunan str2 dengan nilai yang sama, fungsi strlen dan saiz menghasilkan hasil yang berbeza. Khususnya, untuk pengisytiharan:

<code class="c">char *str1 = "Sanjeev";
char str2[] = "Sanjeev";</code>
Salin selepas log masuk

strlen mengembalikan 7 untuk kedua-dua str1 dan str2 kerana ia mengukur panjang jujukan aksara, tidak termasuk penamat nol ( ) pada penghujungnya.

Walau bagaimanapun, sizeof menghasilkan nilai yang berbeza:

  • sizeof(str1) mengembalikan 4 kerana ia menilai saiz pembolehubah penunjuk, yang biasanya 4 bait (sistem 32-bit).
  • sizeof(str2) mengembalikan 8 kerana ia menentukan saiz tatasusunan, yang termasuk null-terminator, menghasilkan 8 bait (7 aksara 1 null-terminator).

Perbezaan Asas : Jenis Data berbanding Peruntukan Memori

sizeof mengukur saiz jenis data, manakala strlen mengukur panjang jujukan aksara. Dalam kes str1, ia adalah penunjuk kepada char, jadi sizeof mengembalikan saiz penunjuk. Untuk str2, ia ialah tatasusunan aksara, jadi sizeof mengembalikan saiz keseluruhan tatasusunan, termasuk null-terminator.

Pandangan Lebih Dekat

Untuk menunjukkan perbezaan yang lebih baik, pertimbangkan:

<code class="c">char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;</code>
Salin selepas log masuk

Sekarang, kedua-dua str1 dan str2 menghala ke tatasusunan yang sama. Nilai strlennya ialah 7, tetapi saiz nilainya berbeza:

  • sizeof(str1) ialah 4 (saiz penunjuk)
  • sizeof(str2) ialah 8 (saiz tatasusunan dengan null-terminator )

Ini menunjukkan bagaimana penilaian saiz bergantung pada struktur data asas.

Atas ialah kandungan terperinci Mengapakah `strlen` dan `sizeof` menghasilkan hasil yang berbeza untuk rentetan berasaskan penunjuk dan berasaskan tatasusunan 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!