หน่วยความจำผิดพลาดด้วยการใช้ const char*?

สวัสดี ฉันกำลังทำงานกับ C++ บนแพลตฟอร์ม Linux ฉันต้องรับค่าของตัวแปรสภาพแวดล้อม (กำหนดโดยผู้ใช้) และใช้งานเพิ่มเติม ต่อไปนี้เป็นรหัสที่ฉันใช้

const char *show_line = getenv ("MY_SHOW_LINES");

bool myFlag = (strcmp(show_line, "1") == 0) ? false : true;

โค้ดด้านบนทำงานอย่างถูกต้องเมื่อฉันตั้งค่าของตัวแปรสภาพแวดล้อม (MY_SHOW_LINES) เท่ากับ 1 แต่เมื่อฉันยกเลิกการตั้งค่าของมัน (เช่น unset MY_SHOW_LINES) โค้ดด้านบนทำให้เกิดข้อผิดพลาดของหน่วยความจำ มีข้อเสนอแนะเกี่ยวกับพฤติกรรมที่ UN คาดหวังข้างต้นหรือไม่ ขอบคุณล่วงหน้า


person BSalunke    schedule 11.04.2012    source แหล่งที่มา
comment
ดู stackoverflow.com/questions/4932848/strcmp-behaviour   -  person Rohit Karlupia    schedule 11.04.2012


คำตอบ (2)


หากคุณส่งผ่านตัวชี้ NULL ไปที่ strcmp คุณจะได้รับพฤติกรรมที่ไม่ได้กำหนดไว้ ในกรณีนี้ มีแนวโน้มว่าจะเกิดความผิดพลาดอย่างมาก

คุณทราบหรือไม่ว่าพอยน์เตอร์อาจเป็น NULL กล่าวคือ จงใจไม่ถูกต้อง

คุณควรป้องกันความเป็นไปได้นี้:

bool myFlag = false; // set default value
if ( show_line != NULL ) {
    myFlag = ( strcmp(show_line, "1") != 0 ); // "? false : true" same as NOT…
}
person Potatoswatter    schedule 11.04.2012

ตามหน้าคน

ฟังก์ชัน getenv() จะส่งคืนพอยน์เตอร์ไปยังค่าในสภาพแวดล้อม หรือคืนค่า NULL หากไม่มีค่าที่ตรงกัน

ดังนั้นหากไม่มีอยู่ ก็จะส่งกลับ NULL ซึ่งทำให้เกิดปัญหาการย่อยอาหารสำหรับ strcmp()

person glglgl    schedule 11.04.2012