ใน C ค่า NULL เป็นค่าคงที่เชิงสัญลักษณ์ที่ชี้ไปยังจุดที่ไม่มีอยู่ในหน่วยความจำเสมอ แม้ว่าโปรแกรมเมอร์หลายคนจะถือว่าค่านี้เท่ากับ 0 นี่เป็นการทำให้เข้าใจง่ายซึ่งสามารถทำให้คุณสะดุดได้ในภายหลัง เป็นการดีที่สุดที่จะตรวจสอบพอยน์เตอร์ของคุณกับ NULL โดยตรง และใช้ 0 ในบริบทอื่น ซึ่งช่วยให้โค้ดของคุณสะอาดและเข้าใจง่าย เนื่องจากคุณจะรู้ว่าคุณกำลังใช้พอยน์เตอร์ทุกครั้งที่เห็นค่า NULL
ขั้นตอน
ส่วนที่ 1 จาก 2: การตรวจสอบค่าว่าง
ขั้นตอนที่ 1 ใช้รหัสตรวจสอบค่าว่างมาตรฐาน
ต่อไปนี้เป็นวิธีที่ชัดเจนที่สุดในการเขียนเช็คว่าง เราจะใช้ ptr ในบทความนี้เป็นชื่อของตัวชี้ที่คุณกำลังตรวจสอบ
-
ถ้า(ptr == NULL)
{
// รหัสถ้าตัวชี้เป็น NULL
} อื่น {
// รหัสถ้าไม่ใช่ NULL
}
ขั้นตอนที่ 2 ทดสอบค่าใดๆ ยกเว้น NULL
บางครั้งก็สะดวกกว่าที่จะทดสอบความไม่เท่าเทียมกันแทน ไม่น่าแปลกใจที่นี่:
-
ถ้า (ptr != NULL) {
// รหัสถ้าไม่ใช่ NULL
}
ขั้นตอนที่ 3 เขียน NULL ก่อนเพื่อหลีกเลี่ยงข้อผิดพลาด (ตัวเลือก)
ข้อเสียเปรียบหลักของวิธี PTR == NULL คือโอกาสที่คุณจะพิมพ์ ptr = NULL แทนโดยไม่ได้ตั้งใจ โดยกำหนดค่า NULL ให้กับตัวชี้นั้น นี้อาจทำให้เกิดอาการปวดหัวที่สำคัญ เนื่องจากการทดสอบความเท่าเทียมกัน (เป็น) ถือว่าตัวถูกดำเนินการแบบสมมาตร คุณจะได้ผลลัพธ์ที่เหมือนกันทุกประการโดยการเขียน ถ้า (NULL == ptr) แทนที่. สิ่งนี้ป้องกันการพิมพ์ผิดมากกว่า เนื่องจาก NULL = ptr โดยไม่ได้ตั้งใจทำให้เกิดข้อผิดพลาดในการคอมไพล์อย่างง่าย
โปรแกรมเมอร์บางคนดูอึดอัดเล็กน้อย แต่ก็ใช้ได้จริง วิธีที่คุณใช้ขึ้นอยู่กับความชอบส่วนบุคคล และคอมไพเลอร์ของคุณตรวจจับข้อผิดพลาด if (ptr = NULL) ได้ดีเพียงใด
ขั้นตอนที่ 4 ทดสอบว่าตัวแปรเป็นจริงหรือไม่
ง่ายๆ ถ้า (ptr) ทดสอบว่า ptr เป็น TRUE หรือไม่ มันจะคืนค่า FALSE ถ้า ptr เป็น NULL หรือถ้า ptr เป็น 0 ความแตกต่างนั้นไม่สำคัญในหลายกรณี แต่โปรดทราบว่าสิ่งเหล่านี้ไม่เหมือนกันในทุกสถาปัตยกรรม
สิ่งที่ตรงกันข้ามคือ ถ้า (!ptr) ซึ่งจะคืนค่า TRUE หาก ptr เป็น FALSE
ส่วนที่ 2 จาก 2: การหลีกเลี่ยงข้อผิดพลาด
ขั้นตอนที่ 1 ตั้งค่าตัวชี้ก่อนตรวจสอบค่า NULL
ข้อผิดพลาดทั่วไปประการหนึ่งคือการสมมติว่าตัวชี้ที่สร้างขึ้นใหม่มีค่า NULL นี่ไม่เป็นความจริง. ตัวชี้ที่ไม่ได้กำหนดจะยังชี้ไปยังที่อยู่หน่วยความจำ ไม่ใช่ที่อยู่ที่คุณระบุ เป็นเรื่องปกติในการตั้งค่าพอยน์เตอร์ที่สร้างขึ้นใหม่หรือตัวชี้อิสระเป็น NULL เพื่อให้แน่ใจว่าคุณไม่ได้ใช้ที่อยู่ที่ไม่ช่วยเหลือนี้โดยบังเอิญ
-
หลีกเลี่ยงข้อผิดพลาดนี้:
ถ่าน *ptr;
ถ้า(ptr == NULL)
{
//สิ่งนี้จะส่งกลับ FALSE ตัวชี้ได้รับการกำหนดค่าที่ถูกต้อง
}
-
แทนที่จะเขียนว่า:
ถ่าน *ptr = NULL; //สิ่งนี้กำหนดพอยน์เตอร์ให้กับ NULL
ถ้า(ptr == NULL)
{
// ค่านี้จะคืนค่า TRUE หากยังไม่ได้กำหนดตัวชี้ใหม่
}
ขั้นตอนที่ 2 ให้ความสนใจกับฟังก์ชันที่สามารถคืนค่า NULL ได้
หากฟังก์ชันสามารถคืนค่า NULL ได้ ให้พิจารณาว่านี่เป็นไปได้หรือไม่ และนั่นจะทำให้เกิดปัญหาในภายหลังในโค้ดของคุณหรือไม่ นี่คือตัวอย่างของฟังก์ชัน malloc โดยใช้การตรวจสอบค่าว่าง (ถ้า (ptr)) เพื่อให้แน่ใจว่าจัดการเฉพาะพอยน์เตอร์ที่มีค่าที่ถูกต้อง:
-
int *ptr = malloc(N * sizeof(int));
ถ้า (ptr) {
int ฉัน;
สำหรับ (i = 0; i < N; ++i)
ptr = ผม;
}
ขั้นตอนที่ 3 เข้าใจว่า NULL เป็น 0 แต่คุณควรใช้ NULL แทน 0 เสมอเมื่อทำงานกับพอยน์เตอร์เพื่อความชัดเจน
ในอดีต C แทนค่า NULL เป็นตัวเลข 0 (นั่นคือ 0x00) ทุกวันนี้อาจซับซ้อนขึ้นเล็กน้อยและแตกต่างกันไปตามระบบปฏิบัติการ โดยปกติคุณสามารถตรวจสอบ NULL ได้โดยใช้ ptr == 0 แต่มีบางกรณีที่อาจทำให้เกิดปัญหาได้ บางทีที่สำคัญกว่านั้น การใช้ NULL ทำให้ชัดเจนว่าคุณกำลังทำงานกับพอยน์เตอร์สำหรับผู้อื่นที่อ่านโค้ดของคุณ