Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `strlen` dan `sizeof` memberikan hasil yang berbeza untuk pemulaan rentetan penunjuk dan tatasusunan dalam C?

Mengapakah `strlen` dan `sizeof` memberikan hasil yang berbeza untuk pemulaan rentetan penunjuk dan tatasusunan dalam C?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-01 00:42:28169semak imbas

Why do `strlen` and `sizeof` give different results for pointer and array string initialization in C?

Permulaan Rentetan Penunjuk vs. Tatasusunan: Percanggahan dalam strlen dan saiz

Dalam pengaturcaraan C, penggunaan penunjuk dan tatasusunan untuk memulakan rentetan boleh membawa kepada jurang yang tidak dijangka dalam output strlen dan sizeof. Mari kita analisa fenomena ini dengan meneliti contoh khusus.

Coretan 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>

menghasilkan output berikut:

7 4
7 8

Variasi timbul disebabkan oleh perbezaan asas antara penunjuk dan tatasusunan dalam jenis data dan saiz objeknya.

Penunjuk (str1)

  • strlen(str1) mengembalikan 7, mewakili panjang rentetan yang ditunjuk oleh str1 (tidak termasuk penamat nol).
  • sizeof(str1) mengembalikan 4 kerana str1 ialah pembolehubah penunjuk dengan alamat memori 4-bait (sistem 32-bit).

Array (str2)

  • strlen(str2) mengembalikan 7 juga, mengambil kira panjang rentetan dalam tatasusunan.
  • sizeof( str2) mengembalikan 8 kerana str2 ialah tatasusunan yang mengandungi lapan aksara, termasuk penamat nol.

Untuk menggambarkan konsep ini dengan lebih lanjut, mari kita ubah suai kod sedikit:

<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>

Kod ini akan menghasilkan keputusan yang sama untuk kedua-dua str1 dan str2 dari segi strlen: 7. Walau bagaimanapun, sizeof(str1) akan kekal 4, mewakili alamat memori, manakala sizeof(str2) akan melaraskan kepada 8, masih mengambil kira aksara yang ditamatkan nol.

Oleh itu, perkara penting ialah memahami jenis data yang berbeza dan ciri saiz penunjuk dan tatasusunan apabila bekerja dengan rentetan dalam pengaturcaraan C.

Atas ialah kandungan terperinci Mengapakah `strlen` dan `sizeof` memberikan hasil yang berbeza untuk pemulaan rentetan penunjuk dan tatasusunan 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