ตัวชี้ชี้ไปที่ 0x0000 เหมือนกับตัวชี้ที่ตั้งค่าเป็น NULL หรือไม่ ถ้าค่า NULL ถูกกำหนดในภาษา C แปลตำแหน่งทางกายภาพเป็นอะไร มันเหมือนกับ 0x0000 ฉันจะหารายละเอียดเพิ่มเติมเกี่ยวกับแนวคิดเหล่านี้ได้ที่ไหน
ตัวชี้ชี้ไปที่ 0x0000 เหมือนกับตัวชี้ที่ตั้งค่าเป็น NULL หรือไม่ ถ้าค่า NULL ถูกกำหนดในภาษา C แปลตำแหน่งทางกายภาพเป็นอะไร มันเหมือนกับ 0x0000 ฉันจะหารายละเอียดเพิ่มเติมเกี่ยวกับแนวคิดเหล่านี้ได้ที่ไหน
คำตอบ:
จุดที่คำตอบส่วนใหญ่ที่นี่ไม่ได้กล่าวถึงอย่างน้อยก็ไม่ชัดเจนก็คือตัวชี้ nullเป็นค่าที่มีอยู่ระหว่างการดำเนินการและค่าคงที่ตัวชี้โมฆะคือโครงสร้างประโยคที่มีอยู่ในซอร์สโค้ด C
คงชี้โมฆะเป็นคำตอบที่ถูกต้อง Karlson ของรัฐเป็นทั้งการแสดงออกจำนวนเต็มอย่างต่อเนื่องกับค่า 0 (ง่าย0
เป็นตัวอย่างที่พบมากที่สุด) หรือดังกล่าวแสดงออกถึงความหล่อvoid*
(เช่น(void*)0
)
NULL
เป็นแมโครที่กำหนดไว้ใน<stddef.h>
หลายส่วนหัวมาตรฐานอื่น ๆ ที่จะขยายไปสู่การดำเนินการกำหนดตัวชี้โมฆะคงที่ โดยทั่วไปแล้วการขยายตัวเป็นอย่างใดอย่างหนึ่ง0
หรือ((void*)0)
(จำเป็นต้องใช้วงเล็บด้านนอกเพื่อตอบสนองกฎภาษาอื่น ๆ )
ดังนั้นตามตัวอักษร0
เมื่อใช้ในบริบทที่ต้องการนิพจน์ชนิดพอยน์เตอร์จะประเมินค่าเสมอnull pointer
คือค่าพอยน์เตอร์เฉพาะที่ชี้ไปที่วัตถุใด ๆ แต่นั่นไม่ได้หมายความถึงอะไรเกี่ยวกับการเป็นตัวแทนของการชี้โมฆะ พอยน์เตอร์พอยน์เตอร์นั้นมักใช้แทนค่าเป็นบิตทั้งหมด แต่มันสามารถถูกแทนด้วยอะไรก็ได้ แต่ถึงแม้ว่าตัวชี้โมฆะจะแสดงเป็น0xDEADBEEF
, 0
หรือ(void*)0
ยังคงมีอย่างต่อเนื่องชี้โมฆะ
คำตอบสำหรับคำถามเกี่ยวกับ stackoverflowครอบคลุมถึงสิ่งนี้
สิ่งนี้บ่งบอกถึงสิ่งอื่น ๆ ที่memset()
หรือcalloc()
ซึ่งสามารถตั้งค่าขอบเขตของหน่วยความจำเป็น all-bits-zero ไม่จำเป็นต้องตั้งค่าพอยน์เตอร์ใด ๆ ในภูมิภาคนั้นเป็นพอยน์เตอร์พอยน์เตอร์ พวกเขามีแนวโน้มที่จะทำเช่นนั้นในการใช้งานส่วนใหญ่ แต่ภาษาไม่รับประกัน
ผมไม่ทราบว่าทำไมคำถามนี้จะไม่ถือว่าเป็นซ้ำของคนนี้หรือว่ามันเป็นเฉพาะที่นี่
NULL
หรือใด ๆคงชี้โมฆะเพื่อชี้วัตถุชุดว่ามูลค่าของวัตถุไปชี้โมฆะ ในระดับเครื่องมันอาจชี้ไปที่หน่วยความจำที่ถูกต้อง การอ้างอิงตัวชี้ null มีลักษณะการทำงานที่ไม่ได้กำหนด การเข้าถึงหน่วยความจำที่แอดเดรส0x0000000
เป็นพฤติกรรมที่ถูกต้องเช่นเดียวกับสิ่งอื่น ที่อยู่นั้นแตกต่างจากที่อยู่อื่น ๆ โดย (a) เปรียบเทียบเท่ากับNULL
และ (b) เปรียบเทียบไม่เท่ากันกับตัวชี้ใด ๆ กับวัตถุ C ตัวชี้ null เป็นพลชี้ค่าใช้เพื่อบ่งชี้ว่ามันไม่ได้ชี้ไปที่ใด
ทุกแพลตฟอร์มออกมีอิสระในการกำหนด NULL ตามที่พอใจ
ตามมาตรฐาน C หากคุณกำหนดค่าศูนย์เป็นตัวชี้มันจะถูกแปลงเป็นค่า NULL (สำหรับแพลตฟอร์มนั้น) อย่างไรก็ตามหากคุณใช้ตัวชี้ NULL และส่งไปยัง int ไม่มีการรับประกันว่าคุณจะได้รับศูนย์ บนทุกแพลตฟอร์มที่นั่น ความจริงก็คือบนแพลตฟอร์มส่วนใหญ่มันจะเป็นศูนย์
ข้อมูลเกี่ยวกับสิ่งที่คุณจะพบในซีจำเพาะภาษา แหล่งข้อมูลหนึ่งความน่าเชื่อถือที่ฉันไม่สามารถรับรองได้คือ: http://www.winapi.co.kr/pds/doc/ISO-C-FDIS.1999-04.pdf
NULL pointer constant
ถ้าพวกเขาเลือกที่จะหนีออกไปจากมาตรฐานที่พวกเขามีอิสระที่จะกำหนด เท่าที่ฉันรู้ไม่มีคอมไพเลอร์ออกมีที่ทำอย่างนั้น
NULL
มาโครซึ่งมีการขยายตัวออกไป0
ใน C ++ และทั้ง0
หรือ(void *)0
ใน C, เพราะนั่นคือของจริง "ค่าคงที่ตัวชี้โมฆะ"
มันถูกกำหนดในภาษา C เพราะไม่มีที่อยู่เครื่องไม่เปลี่ยนแปลงใด ๆ ที่มันเท่ากับ ถ้าเป็นเช่นนั้นเราไม่จำเป็นต้องมีสิ่งที่เป็นนามธรรม! แม้ว่าในแพลตฟอร์มส่วนใหญ่แล้ว NULL อาจถูกนำมาใช้เป็น 0 ในบางประเภทหรืออื่น ๆ ในที่สุดมันก็ผิดที่คิดว่ามันเป็นสากลดังนั้นหากคุณสนใจเรื่องการพกพา
ตามส่วนเอกสารมาตรฐาน C6.3.2.3
:
นิพจน์ค่าคงที่จำนวนเต็มที่มีค่า 0 หรือนิพจน์ดังกล่าวที่พิมพ์เป็นโมฆะ * เรียกว่าค่าคงที่ตัวชี้โมฆะ 53) ถ้าค่าคงตัวตัวชี้โมฆะถูกแปลงเป็นประเภทตัวชี้ตัวชี้ผลลัพธ์จะเรียกว่าตัวชี้โมฆะคือ รับประกันว่าจะเปรียบเทียบไม่เท่ากันกับตัวชี้ไปยังวัตถุหรือฟังก์ชั่นใด ๆ
จนถึงตอนนี้ฉันยังไม่เห็นคอมไพเลอร์ที่แตกสลายจากสิ่งนี้