ค่าตัวชี้โมฆะหมายถึง "ไม่มีที่ไหนเลย" กำหนด; มันเป็นค่าตัวชี้ที่ไม่ถูกต้องซึ่งรับประกันว่าจะเปรียบเทียบไม่เท่ากันกับค่าตัวชี้อื่น ๆ ความพยายามในการยกเลิกการอ้างอิงตัวชี้โมฆะส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนดและโดยปกติจะนำไปสู่ข้อผิดพลาดรันไทม์ดังนั้นคุณต้องการให้แน่ใจว่าตัวชี้ไม่ได้เป็น NULL ก่อนที่จะพยายามตรวจสอบซ้ำ ฟังก์ชันไลบรารี C และ C ++ จำนวนมากจะส่งคืนพอยน์เตอร์พอยน์เตอร์เพื่อระบุเงื่อนไขข้อผิดพลาด ตัวอย่างเช่นฟังก์ชั่นห้องสมุดmalloc
จะส่งกลับค่าตัวชี้โมฆะหากไม่สามารถจัดสรรจำนวนไบต์ที่ได้รับการร้องขอและการพยายามเข้าถึงหน่วยความจำผ่านตัวชี้นั้นจะนำไปสู่ข้อผิดพลาดรันไทม์:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
ดังนั้นเราต้องแน่ใจว่าการmalloc
โทรสำเร็จโดยการตรวจสอบค่าของp
เทียบกับ NULL:
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
ตอนนี้ลองไปที่ถุงเท้าของคุณสักครู่นี่จะเป็นเรื่องเล็กน้อย
มีตัวชี้โมฆะคือค่าและตัวชี้โมฆะคงที่และทั้งสองไม่จำเป็นต้องเหมือนกัน ตัวชี้ null ค่าเป็นสิ่งที่คุ้มค่าการใช้งานสถาปัตยกรรมต้นแบบที่จะเป็นตัวแทน "ไม่มีที่ไหนเลย" ค่านี้อาจเป็น 0x00000000 หรือ 0xFFFFFFFF หรือ 0xDEADBEEF หรือสิ่งที่แตกต่างอย่างสิ้นเชิง ไม่คิดว่าตัวชี้โมฆะค่าอยู่เสมอ 0
ค่าคงที่ตัวชี้โมฆะOTOH เป็นนิพจน์อินทิกรัล 0 ค่าเสมอ เท่าที่ซอร์สโค้ดของคุณเกี่ยวข้อง 0 (หรือนิพจน์ที่สำคัญใด ๆ ที่ประเมินเป็น 0) หมายถึงตัวชี้โมฆะ ทั้ง C และ C ++ กำหนดแมโคร NULL เป็นค่าคงที่ตัวชี้โมฆะ เมื่อรหัสของคุณจะรวบรวมตัวชี้ null คงที่จะถูกแทนที่ด้วยตัวชี้ null ที่เหมาะสมคุ้มค่าในรหัสเครื่องที่สร้างขึ้น
นอกจากนี้โปรดระวังว่า NULL เป็นเพียงหนึ่งในค่าตัวชี้ที่ไม่ถูกต้องที่เป็นไปได้ หากคุณประกาศตัวแปรตัวชี้อัตโนมัติโดยไม่มีการกำหนดค่าเริ่มต้นอย่างชัดเจนเช่น
int *p;
ค่าเริ่มต้นที่เก็บไว้ในตัวแปรไม่แน่นอนและอาจไม่สอดคล้องกับที่อยู่หน่วยความจำที่ถูกต้องหรือสามารถเข้าถึงได้ น่าเสียดายที่ไม่มีวิธี (แบบพกพา) ในการบอกว่าค่าตัวชี้ที่ไม่ใช่ค่า NULL นั้นถูกต้องหรือไม่ก่อนที่จะพยายามใช้ ดังนั้นหากคุณกำลังติดต่อกับพอยน์เตอร์คุณควรกำหนดค่าเริ่มต้นเป็น NULL อย่างชัดเจนเมื่อคุณประกาศและตั้งค่าเป็น NULL เมื่อไม่ได้ชี้ไปที่อะไร
โปรดทราบว่านี่เป็นปัญหาใน C มากกว่า C ++ สำนวน C ++ ไม่ควรใช้พอยน์เตอร์ทั้งหมด