1. NULL ในภาษา C คืออะไร?
ในภาษา C NULL
เป็นแนวคิดที่สำคัญมาก โดยเป็นค่าคงที่พิเศษที่ใช้ระบุว่าพอยน์เตอร์ชี้ไปยังที่อยู่หน่วยความจำที่ไม่ถูกต้อง ปกติพอยน์เตอร์จะชี้ไปยังตำแหน่งหน่วยความจำที่เฉพาะเจาะจง แต่หากไม่ได้ชี้ไปที่ใด NULL
จะถูกกำหนดให้กับพอยน์เตอร์นั้น การใช้งานนี้จำเป็นเพื่อความเสถียรของโปรแกรมและป้องกันการเข้าถึงหน่วยความจำโดยผิดพลาด
นิยามของ NULL
NULL
ถูกกำหนดไว้ใน <stddef.h>
และโดยค่าของมันจะเท่ากับ 0 ในทางตัวเลข เช่น ตัวอย่างด้านล่างนี้เป็นการกำหนดค่าเริ่มต้นของพอยน์เตอร์ให้เป็น NULL
#include <stddef.h>
int *ptr = NULL;
ที่นี่หมายความว่าพอยน์เตอร์ไม่ได้ชี้ไปยังที่อยู่หน่วยความจำใด ๆ หากการจัดสรรหน่วยความจำล้มเหลว NULL
จะถูกส่งคืนและนำไปใช้สำหรับการจัดการข้อผิดพลาด
ความแตกต่างระหว่าง NULL กับค่าพิเศษอื่น
มักจะสับสนระหว่าง NULL กับ 0 ที่เป็นตัวเลข หรือกับ ‘ ‘ ที่ใช้เป็นอักขระสิ้นสุดสายอักขระ (null character) ทั้งหมดนี้มีหน้าที่ต่างกัน จึงต้องระมัดระวัง
- NULL: ใช้ระบุว่าพอยน์เตอร์ไม่ถูกต้อง
- 0: ค่าศูนย์เชิงตัวเลข
- ‘ ‘: อักขระ null สำหรับสิ้นสุดสายอักขระ
การเข้าใจความแตกต่างและใช้งานให้ถูกต้องจะช่วยป้องกันปัญหาการทำงานผิดพลาดของโปรแกรม
2. ความสำคัญของ NULL Pointer
ในภาษา C พอยน์เตอร์เป็นฟีเจอร์ที่ทรงพลังมากในการเข้าถึงและจัดการที่อยู่หน่วยความจำโดยตรง แต่ก็มีความเสี่ยง หากพอยน์เตอร์ชี้ไปยังที่อยู่ที่ไม่ถูกต้อง โปรแกรมอาจเกิด crash ได้ จึงจำเป็นต้องกำหนดค่าเริ่มต้นเป็น NULL
เสมอ
การกำหนดค่าเริ่มต้นเป็น NULL
พอยน์เตอร์ที่ไม่ได้กำหนดค่าเริ่มต้น อาจชี้ไปยังที่อยู่หน่วยความจำที่ไม่ถูกต้อง ซึ่งเรียกว่า “dangling pointer” ซึ่งเป็นสถานะอันตราย เพื่อป้องกัน ควรกำหนดค่าเริ่มต้นเป็น NULL เสมอ
int *ptr = NULL;
การกำหนดเช่นนี้หมายความว่าพอยน์เตอร์ยังไม่ได้ถูกใช้งาน ลดความเสี่ยงจากการเข้าถึงหน่วยความจำผิดพลาด
การเช็คค่า NULL อย่างปลอดภัย
ก่อนใช้งานพอยน์เตอร์ ควรตรวจสอบว่ามีค่าเป็น NULL หรือไม่เสมอ วิธีนี้ช่วยป้องกันการเข้าถึงหน่วยความจำผิดพลาด และรับประกันความปลอดภัยของโปรแกรม
if (ptr != NULL) {
*ptr = 100;
}
การเช็ค NULL แบบนี้จะทำให้ตรวจสอบสถานะของพอยน์เตอร์ได้ง่าย และหลีกเลี่ยงการ crash ที่ไม่คาดคิด
3. ตัวอย่างปฏิบัติ: การจัดการหน่วยความจำด้วย NULL
ในภาษา C เมื่อใช้ malloc
หรือ calloc
สำหรับการจัดสรรหน่วยความจำ หากล้มเหลวจะคืนค่า NULL
ดังนั้นการเช็ค NULL จะช่วยให้สามารถจัดการข้อผิดพลาดได้
ตัวอย่างการจัดสรรหน่วยความจำ
ตัวอย่างด้านล่างเป็นการใช้ฟังก์ชัน malloc
เพื่อจัดสรรหน่วยความจำ พร้อมตรวจสอบผลลัพธ์
int *ptr = (int *)malloc(sizeof(int));
if (ptr == NULL) {
printf("การจัดสรรหน่วยความจำล้มเหลว\n");
} else {
*ptr = 100;
printf("กำหนดค่า %d ให้กับหน่วยความจำที่จัดสรร\n", *ptr);
}
หากจัดสรรหน่วยความจำไม่สำเร็จ จะคืนค่า NULL
และสามารถนำไปจัดการข้อผิดพลาดได้อย่างปลอดภัย
การกำหนด NULL หลังจากคืนหน่วยความจำ
หลังจากใช้ free
เพื่อคืนหน่วยความจำแล้ว แนะนำให้ตั้งค่าพอยน์เตอร์นั้นเป็น NULL เพื่อป้องกันการใช้งานผิดพลาดในภายหลัง
free(ptr);
ptr = NULL;
การปฏิบัติแบบนี้จะช่วยป้องกัน dangling pointer ลดโอกาสเกิด memory leak หรือ crash ที่ไม่คาดคิด

4. ตัวอย่างการใช้งาน NULL check
การเช็คค่า NULL เป็นเทคนิคพื้นฐานสำหรับการเขียนโปรแกรมอย่างปลอดภัยในภาษา C ด้านล่างคือตัวอย่างการสร้างฟังก์ชันเช็คค่า NULL
int isNull(int *ptr) {
return ptr == NULL;
}
int main() {
int *ptr = NULL;
if (isNull(ptr)) {
printf("พอยน์เตอร์เป็น null\n");
} else {
printf("พอยน์เตอร์ใช้งานได้\n");
}
return 0;
}
การใช้ฟังก์ชัน isNull
จะช่วยตรวจสอบสถานะของพอยน์เตอร์ได้ง่าย ทำให้โค้ดอ่านง่ายและดูแลรักษาง่ายขึ้น
5. ข้อควรระวังในการใช้ NULL
ขณะใช้งาน NULL มีข้อควรระวังบางประการ โดยเฉพาะอย่างยิ่งอย่าสับสนระหว่าง NULL, 0 และ ‘ ‘ เพราะแต่ละค่ามีหน้าที่และการใช้งานต่างกัน
ความแตกต่างระหว่าง NULL, 0 และ ‘ ‘
- NULL: พอยน์เตอร์ที่ชี้ไปยังที่อยู่หน่วยความจำที่ไม่ถูกต้อง
- 0: ค่าศูนย์เชิงตัวเลข
- ‘ ‘: อักขระ null ที่ใช้สำหรับสิ้นสุดสายอักขระ
เมื่อเข้าใจความแตกต่างเหล่านี้ จะช่วยป้องกันปัญหาการทำงานผิดพลาดของโปรแกรม และควรจัดการหน่วยความจำและตรวจสอบข้อผิดพลาดให้เหมาะสมเมื่อใช้ NULL