ในโปรแกรม C ของฉันฉันมักต้องการวิธีในการสร้างการแสดงสตริงของ ADT ของฉัน แม้ว่าฉันไม่จำเป็นต้องพิมพ์สตริงไปที่หน้าจอ แต่อย่างใดมันก็เรียบร้อยที่จะมีวิธีการดังกล่าวสำหรับการดีบั๊ก ฟังก์ชันประเภทนี้มักเกิดขึ้น
char * mytype_to_string( const mytype_t *t );
ฉันรู้จริงว่าฉันมี (อย่างน้อย) สามตัวเลือกที่นี่เพื่อจัดการหน่วยความจำสำหรับสตริงที่จะกลับมา
ทางเลือก 1: การจัดเก็บสตริงส่งคืนในอาร์เรย์ char แบบคงที่ในฟังก์ชัน ฉันไม่ต้องการคิดมากนักยกเว้นว่าสตริงนั้นจะถูกเขียนทับทุกครั้งที่โทร ซึ่งอาจเป็นปัญหาในบางโอกาส
ทางเลือกที่ 2: จัดสรรสตริงบนฮีพด้วย malloc ภายในฟังก์ชัน เรียบร้อยจริงๆตั้งแต่ฉันไม่ต้องคิดขนาดของบัฟเฟอร์หรือการเขียนทับ อย่างไรก็ตามฉันต้องจำให้ฟรี () สตริงเมื่อทำแล้วฉันยังต้องกำหนดให้กับตัวแปรชั่วคราวเช่นที่ฉันสามารถฟรี แล้วการจัดสรรฮีปจะช้ากว่าการจัดสรรสแต็คมากจริงๆดังนั้นจึงเป็นคอขวดถ้าทำซ้ำในลูป
ทางเลือก 3: ส่งผ่านตัวชี้ไปยังบัฟเฟอร์และให้ผู้เรียกจัดสรรบัฟเฟอร์นั้น ชอบ:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
วิธีนี้จะทำให้ความพยายามมากขึ้นในการโทร ฉันยังสังเกตเห็นว่าทางเลือกนี้ให้ตัวเลือกอื่นแก่ฉันตามลำดับของอาร์กิวเมนต์ ข้อโต้แย้งใดที่ฉันควรมีก่อนและสุดท้าย (จริง ๆ แล้วมีความเป็นไปได้หกอย่าง)
แล้วฉันควรเลือกแบบไหนดี? ทำไม? มีมาตรฐานที่ไม่เป็นลายลักษณ์อักษรในหมู่นักพัฒนา C หรือไม่
sysctlbyname
ใน OS X และ iOS