Index Out of Bounds คืออะไร?
สมมติ Array ขนาด 4 ตัว มี Index อยู่ที่ 0 ถึง 3 หากเข้าถึง Index 4 ขึ้นไป** เรียกว่า **Index Out of Bounds**
พฤติกรรมของ C
- คอมไพเลอร์ **ไม่แจ้ง Error** (Compile ผ่าน)
- โปรแกรม **Run ได้** (ไม่ Crash ทันที)
- แต่ **ผลลัพธ์ไม่แน่นอน (Undefined Behavior)** - อาจได้ค่า Garbage, Crash ภายหลัง, หรือทำลายข้อมูลตัวแปรอื่น
- ต้องระวังมาก** ขณะใช้ Array Index
ตัวอย่างโปรแกรม
#include <stdio.h>
int main() {
int std[4]; // ขนาด 4: index 0,1,2,3
int i;
std[0] = 100; // ถูกต้อง
std[1] = 200; // ถูกต้อง
std[2] = 300; // ถูกต้อง
std[3] = 400; // ถูกต้อง
std[4] = 500; // ❌ OUT OF BOUNDS! (index 4 ไม่มีอยู่)
// พิมพ์ทั้ง 5 ตัว
for (i = 0; i < 5; i++)
printf("std[%d]: %d\n", i, std[i]);
return 0;
}
ผลลัพธ์ตัวอย่าง:
std[0]: 100
std[1]: 200
std[2]: 300
std[3]: 400
std[4]: 2314 ← Garbage value (ไม่ใช่ 500 ที่กำหนด!)
อธิบาย
- Array ขนาด 4 → Index ที่ถูกต้อง: 0, 1, 2, 3
- กำหนด
std[4] = 500เขียนทับหน่วยความจำที่ไม่ได้จองไว้ - ตอนพิมพ์
std[4]ได้ค่า 2314 (Garbage) ไม่ใช่ 500 - อาจทำให้โปรแกรม Crash ภายหลัง หรือทำลายตัวแปรอื่นได้
วิธีป้องกัน
- ใช้ Loop condition ให้ถูกต้อง:
i < sizeไม่ใช่i <= size - ใช้
assert(index >= 0 && index < size)ในโหมด Debug - เครื่องมือ:
Valgrind,AddressSanitizer(-fsanitize=address) - ใช้
std::vector(C++) หรือ Library ที่มี Bounds Checking
ข้อเท็จจริงสำคัญ
C ไม่ทำ Bounds Checking ให้อัตโนมัติ → เป็นความรับผิดชอบของโปรแกรมเมอร์ทั้งหมด