การเข้าใจความแตกต่างในการ สร้างสตริง
ใน C: ด้วยและไม่มีตัวสิ้นสุดที่ตามมา
เมื่อทำงานกับสตริงในภาษา C จำเป็นต้องเข้าใจว่าการเริ่มต้นทำงานอย่างไร คำถามที่พบบ่อยระหว่างนักพัฒนาคือความแตกต่างระหว่างการเริ่มต้นอาร์เรย์ตัวอักษรด้วยตัวสิ้นสุดที่ตามมาที่ชัดเจนกับสตริงว่าง
ในบล็อกโพสต์นี้ เราจะวิเคราะห์วิธีการเฉพาะสองวิธีในการเริ่มต้นสตริงใน C:
char str1[32] = "\0";
และ
char str2[32] = "";
มาวิเคราะห์ความหมายของแต่ละแบบและเปรียบเทียบกัน
การเริ่มต้นสตริงอธิบาย
การประกาศ
ทั้งสองการประกาศนี้สร้างอาร์เรย์ของตัวอักษรขนาด 32 อย่างไรก็ตาม จะมีค่าตั้งต้นที่แตกต่างกัน
-
char str1[32] = "\0";
- ในที่นี้ คุณกำลังเริ่มต้นองค์ประกอบแรกของอาร์เรย์เป็นตัวอักษร null (
\0
) ซึ่งทำให้สตริงเป็นค่าว่างแต่ยังเหลือองค์ประกอบอื่น ๆ ของอาร์เรย์ที่ไม่ได้ถูกเริ่มต้น (หมายความว่าอาจมีค่าขยะอยู่ในนั้น)
- ในที่นี้ คุณกำลังเริ่มต้นองค์ประกอบแรกของอาร์เรย์เป็นตัวอักษร null (
-
char str2[32] = "";
- นี่คือการเริ่มต้นองค์ประกอบแรกเป็นตัวอักษร null (
\0
) เช่นกัน แต่ยังเริ่มต้นองค์ประกอบอื่น ๆ ของอาร์เรย์เป็น\0
โดยอัตโนมัติเนื่องจากคุณได้ประกาศด้วยสตริงว่าง
- นี่คือการเริ่มต้นองค์ประกอบแรกเป็นตัวอักษร null (
ตัวอย่างการใช้งาน
คุณอาจคิดว่าการประกาศทั้งสองนี้เทียบเท่ากันเนื่องจากขนาดของมัน แต่มีความแตกต่างที่สำคัญเมื่อไม่มีการระบุขนาด
พิจารณาโค้ดต่อไปนี้:
char a[] = "a\0";
char b[] = "a";
printf("%i %i\n", sizeof(a), sizeof(b));
ผลลัพธ์:
3 2
คำอธิบายของผลลัพธ์
-
สตริง
a
:- สตริงนี้รวมถึงตัวสิ้นสุดที่เป็น null ชัดเจน ส่งผลให้มีขนาดเป็น
3
ซึ่งประกอบด้วย:- ตัวอักษร
'a'
(1 ไบต์) - ตัวสิ้นสุดที่ชัดเจน (
\0
) (1 ไบต์) - ตัวสิ้นสุดที่เป็น null โดยปริยายที่ท้าย (1 ไบต์)
- ตัวอักษร
- สตริงนี้รวมถึงตัวสิ้นสุดที่เป็น null ชัดเจน ส่งผลให้มีขนาดเป็น
-
สตริง
b
:- ในกรณีนี้ สตริงจะมีเพียงตัวอักษร
'a'
และตัวสิ้นสุดที่เป็น null โดยปริยาย ซึ่งทำให้มีขนาดเท่ากับ2
- ในกรณีนี้ สตริงจะมีเพียงตัวอักษร
ข้อสรุปที่สำคัญ
-
การเริ่มต้นด้วยตัวสิ้นสุดที่ตามมา:
เมื่อคุณรวมตัวสิ้นสุด\0
ที่ชัดเจนเข้ามา คุณจะเพิ่มขนาดของสตริงขึ้นอีก 1 ไบต์ มาตรฐาน C จะเพิ่ม\0
อีกตัวที่ท้าย ซึ่งทำให้มีตัวสิ้นสุดรวมทั้งหมดเป็นสองตัว -
หน่วยความจำและการจัดสรร:
การทำความเข้าใจว่าภาษา C จัดการหน่วยความจำสำหรับสตริงนั้นสามารถป้องกันข้อผิดพลาดและบั๊กได้ การรู้จักวิธีที่สตริงถูกเริ่มต้นสามารถส่งผลอย่างมากต่อการจัดสรรและการเข้าถึงหน่วยความจำในแอปพลิเคชันของคุณ -
แนวทางปฏิบัติที่ดีที่สุด:
ให้เริ่มต้นสตริงของคุณอย่างรอบคอบเสมอ โดยคำนึงถึงจำนวนตัวอักษรและตัวสิ้นสุดที่คุณต้องการรวม
ด้วยความรู้นี้ คุณควรรู้สึกมั่นใจมากขึ้นในการนำทางความละเอียดอ่อนของการเริ่มต้นสตริงใน C ขอให้สนุกกับการเขียนโค้ด!