ขอบเขตของตัวแปร C [ซ้ำกัน]
รายการซ้ำที่เป็นไปได้:
การส่งคืนที่อยู่ตัวอักษรสตริงจากฟังก์ชันปลอดภัยและพกพาได้หรือไม่
อายุการใช้งานของสตริงลิเทอรัลใน C
สวัสดี ฉันสับสนนิดหน่อย
char *func()
{
return "Hello";
}
ในที่นี้ "Hello" คือลำดับ/อาร์เรย์ของอักขระ มันเป็นตัวแปรท้องถิ่นและจะต้องหายไปทันทีที่ฟังก์ชันกลับมา แล้วทำไมเราถึงได้ค่าที่ถูกต้องล่ะ?
person
Community
schedule
27.08.2012
source
แหล่งที่มา
คำตอบ (4)
"Hello"
เป็นตัวอักษรสตริงและจะมีอยู่ตลอดอายุของโปรแกรม หากต้องการอ้างอิงส่วนที่เกี่ยวข้องของมาตรฐาน C99:
...ลำดับอักขระแบบหลายไบต์จะถูกใช้เพื่อเริ่มต้นอาร์เรย์ของ ระยะเวลาการจัดเก็บข้อมูลแบบคงที่ และความยาวที่เพียงพอที่จะบรรจุลำดับ...
- 6.2.4 ระยะเวลาในการเก็บรักษาวัตถุ
ออบเจ็กต์ที่มีการประกาศตัวระบุด้วยการเชื่อมโยงภายนอกหรือภายใน หรือมีตัวระบุคลาสการจัดเก็บข้อมูลแบบคงที่จะมี ระยะเวลาการจัดเก็บข้อมูลแบบคงที่ อายุการใช้งานคือการดำเนินการทั้งหมดของโปรแกรม และค่าที่เก็บไว้จะถูกเตรียมใช้งานเพียงครั้งเดียว ก่อนที่จะเริ่มโปรแกรม
ค่าที่ส่งกลับของฟังก์ชันควรเป็น const char*
เนื่องจากความพยายามในการแก้ไขตัวอักษรสตริงเป็นพฤติกรรมที่ไม่ได้กำหนดไว้
person
hmjd
schedule
27.08.2012
มีความคงที่และมีที่อยู่คงที่ในหน่วยความจำ
person
nshy
schedule
27.08.2012
ฟังก์ชันจะทำลายค่าหลังจากส่งคืนตัวควบคุมแล้วเท่านั้น
ดังนั้น เมื่อถึงเวลาที่คำสั่งส่งคืนถูกพบ "Hello" จะถูกวางไว้เพื่อส่งคืนค่า จากนั้นฟังก์ชันจะทำลายขอบเขต
person
vivek_jonam
schedule
27.08.2012
char*
ไม่ใช่const char*
UB ใช่ไหม - person Neel Basu   schedule 27.08.2012