Aliasing คือ การอ้างอิงไปยังเมมโมรีตำแหน่งหนึ่ง ที่สามารถกระทำได้ด้วยตัวแปร (identifier) มากกว่า 1 ตัวแปรขึ้นไป
ปัญหา Aliasing มักเกิดจากการใช้งานพอยน์เตอร์โดยไม่ระวัง หากไม่เข้าใจก็จะทำให้เสียเวลาหา bug ในโปรแกรมมากขึ้นเช่น
1. | int a;
2. | int *b;
3. | a = 10;
4. | b = &a;
5. | a = 20;
6. | printf (“%d %d\n”, a, *b);
7. | *b = 30;
8. | printf (“%d %d”, a, *b);
9. | a = a + 80;
|
จากโค้ด
บรรทัดที่ 5 พอยน์เตอร์ b จะชี้ไปยังตำแหน่งที่ตัวแปร a อยู่
บรรทัดที่ 6 เมื่อ a มีค่าเท่ากับ 20 ก็พลอยทำให้ค่าที่พอยน์เตอร์ b ชี้คือ 20
บรรทัดที่ 7 แสดงผลลัพธ์จะได้ผลลัพธืเหมือนกันคือ a = 20 คือของพอยน์เตอร์ b ชี้ไปคือ 20 เช่นกัน
บรรทัดที่ 8 ค่าที่พอยน์เตอร์ชี้ ในที่นี้ยังอยู่ตำแหน่งเดิมคือตำแหน่งที่ a อยู่ ถูกแก้ไขเป็น 30
บรรทัดที่ 9 แสดงผลลัพธ์จะได้ผลลัพธืเหมือนกันคือ a = 20 คือของพอยน์เตอร์ b ชี้ไปคือ 30 เช่นกัน
จะเห็นว่าโปรแกรมเมอร์ต้องเข้าใจว่าเมื่อมีการแก้ไขค่าของ a หรือ ค่าที่พอยน์เตอร์อ้างอิงจะมีผลกระทบต่อกันเสมอ
สมมติว่าโปรแกรมเมอร์เขียนโปรแกรมถึงบรรทัดที่ 10 จะเข้าใจว่า a = 20 ตามโค้ดที่ตัวเองเขียน ซึ่งอันที่จริงแล้ว a ถูกแก้ไปเป็น 30 แล้วจาดบรรทัดที่ 8 ดังนั้นผลลัพธ์ที่เกิดขึ้นคือ a = 110 ไม่ใช่ a = 100 ตามที่ตนเองเข้าใจจากการอ่านโค้ด
Dangling Reference
Dangling Reference คือปัญหาที่เกิดจากการใช้งานพอยน์เตอร์ทั้งที่ตำแหน่งที่พอยน์เตอร์ชี้นั้นไม่มีอยู่แล้วในเมมโมรี ปัญหานี้สืบเนื่องต่อจาก Aliasing นั่นเอง
เช่น
1. | int a;
2. | int *b;
3. | a = 10;
4. | b = &a;
5. | a = 20;
6. | printf (“a=%d b=%d a_addr =
%x b_addr = %x \n”, a, *b, &a, b);
7. | b = NULL; //pointer b points to nothing.
8. | printf (“a=%d b=%d a_addr =
%x b_addr = %x ”, a, *b, &a, b);
9. | *b = 40; //Dangling reference
10.| printf (“a=%d b=%d a_addr = %x b_addr = %x ”, a, *b, &a, b);
|
บรรทัดที่ 4 พอยน์เตอร์ b จะชี้ไปที่ตำแหน่งที่ตัวแปร a อยู่ในเมมโมรี
บรรทัดที่ 5 เมื่อกำหนด a = 20 จะมีผลต่อค่าข้อมูลที่พอยน์เตอร์ชี้ตามไปด้วย
บรรทัดที่ 6 ทั้ง a และ *b ค่าเท่ากันคือ 20 และมีตำแหน่งในเมมโมรีที่อ้างอิงเป็นตำแหน่งเดียวกัน
บรรทัดที่ 7 กำหนด Null pointer คือลบการอ้างอิงของพอยน์เตอร์ออกไป หรือพอยน์เตอร์ b ณ ขณะนี้ไม่ได้อ้างอิงไปยังเมมโมรีอีกแล้ว
บรรทัดที่ 8 ค่าที่พอยน์เตอร์ b ชี้ (*b) คือ 0 และไม่มีตำแหน่งที่พอยน์เตอร์ชี้อีกแล้ว ตำแหน่งของ a ยังอยู่ที่เดิม แต่ตำแหน่งของ b ไม่มีแล้ว
บรรทัดที่ 9 การกำหนดค่าที่พอยน์เตอร์ชี้ *b = 40 จะเกิด Error คือ Non pointer reference ถึงแม้ว่าบรรทัดที่ 10 *b จะมีค่าเป็น 40 แต่ตำแหน่งของ b ไม่มีแล้ว และการแก้ไขค่าผ่านพอยน์เตอร์ b ไม่มีผลต่อพอยน์เตอร์ a ดังนั้น a ยังเป็น 20 (ค่าที่แก้ไขล่าสุดในบรรทัดที่ 5)
No comments:
Post a Comment