เป็นไปได้หรือไม่ที่จะเริ่มต้นตัวชี้ C เป็น NULL
TL; DRใช่มาก
เรียกร้องที่เกิดขึ้นจริงในวันที่คู่มืออ่านเหมือน
ในทางกลับกันถ้าคุณใช้การกำหนดเริ่มต้นเพียงครั้งเดียวint *my_int_ptr = 2;
โปรแกรมจะพยายามเติมเนื้อหาของตำแหน่งหน่วยความจำที่ชี้ไปmy_int_ptr
ด้วยค่า 2 เนื่องจากmy_int_ptr
เต็มไปด้วยขยะจึงสามารถเป็นที่อยู่ใดก็ได้ [... ]
ดีที่พวกเขามีความผิดคุณมีสิทธิ
สำหรับคำสั่ง ( ไม่สนใจในตอนนี้ความจริงที่ว่าตัวชี้ไปยังการแปลงจำนวนเต็มเป็นพฤติกรรมที่กำหนดโดยการนำไปใช้งาน )
int * my_int_ptr = 2;
my_int_ptr
เป็นตัวแปร (ชนิดของตัวชี้ไปที่int
) มีที่อยู่ของตัวเอง (ประเภท: ที่อยู่ของตัวชี้เป็นจำนวนเต็ม) คุณกำลังจัดเก็บค่า2
ไว้ในที่อยู่นั้น
ตอนนี้my_int_ptr
เป็นประเภทตัวชี้เราสามารถพูดได้ก็ชี้ไปที่ค่าของ "พิมพ์" ที่ตั้งของหน่วยความจำที่ชี้โดยmy_int_ptr
ค่าที่จัดขึ้นใน ดังนั้นคุณจึงกำหนดค่าของตัวแปรตัวชี้เป็นหลักไม่ใช่ค่าของตำแหน่งหน่วยความจำที่ชี้ไปที่ตัวชี้
ดังนั้นสำหรับข้อสรุป
char *x=NULL;
เริ่มต้นตัวแปรชี้x
จะNULL
ไม่คุ้มค่าที่อยู่หน่วยความจำที่ชี้ไปตามตัวชี้
นี่คือเดียวกันเป็น
char *x;
x = NULL;
การขยาย:
ตอนนี้กำลังปฏิบัติตามอย่างเคร่งครัดคำสั่งเช่น
int * my_int_ptr = 2;
ผิดกฎหมายเนื่องจากเกี่ยวข้องกับการละเมิดข้อ จำกัด ต้องมีความชัดเจน,
my_int_ptr
เป็นตัวแปรตัวชี้ชนิด int *
- ค่าคงที่จำนวนเต็ม
2
มีชนิดint
ตามนิยาม
และพวกเขาไม่ได้เป็นประเภท "เข้ากันได้" ดังนั้นการเริ่มต้นนี้ไม่ถูกต้องเพราะการละเมิดกฎของงานที่เรียบง่ายที่กล่าวถึงในบท§6.5.16.1 / P1 ที่อธิบายไว้ในคำตอบของ Lundin
ในกรณีที่ใครก็ตามที่สนใจว่าการเริ่มต้นเชื่อมโยงกับข้อ จำกัด ของการมอบหมายอย่างง่ายการอ้างอิงC11
บทที่§6.7.9, P11
ตัวเริ่มต้นสำหรับสเกลาร์จะต้องเป็นนิพจน์เดียวซึ่งอยู่ในเครื่องหมายวงเล็บปีกกา ค่าเริ่มต้นของวัตถุคือนิพจน์ (หลังการแปลง) ข้อ จำกัด และการแปลงประเภทเดียวกันกับการมอบหมายงานแบบง่ายโดยใช้ประเภทของสเกลาร์เป็นเวอร์ชันที่ไม่เหมาะสมของประเภทที่ประกาศ
int *x = whatever;
ทำและสิ่งที่int *x; *x = whatever;
ทำint *x = whatever;
จริงพฤติกรรมเช่นไม่int *x; x = whatever;
*x = whatever;