เป็นไปได้หรือไม่ที่จะเริ่มต้นตัวชี้ 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;