Dalam program C saya, saya sering membutuhkan cara untuk membuat representasi string dari ADT saya. Bahkan jika saya tidak perlu mencetak string ke layar dengan cara apa pun, rapi untuk memiliki metode debugging seperti itu. Jadi fungsi semacam ini sering muncul.
char * mytype_to_string( const mytype_t *t );
Saya benar-benar menyadari bahwa saya memiliki (setidaknya) tiga opsi di sini untuk menangani memori agar string dapat kembali.
Alternatif 1: Menyimpan string kembali dalam array char statis dalam fungsi. Saya tidak perlu banyak berpikir, kecuali bahwa string ditimpa pada setiap panggilan. Yang mungkin menjadi masalah dalam beberapa kesempatan.
Alternatif 2: Alokasikan string pada heap dengan malloc di dalam fungsi. Benar-benar rapi karena saya tidak perlu memikirkan ukuran buffer atau penulisan ulang. Namun, saya harus ingat untuk membebaskan () string ketika selesai, dan kemudian saya juga perlu menetapkan variabel sementara sehingga saya bisa membebaskan. dan kemudian alokasi heap benar-benar jauh lebih lambat daripada alokasi stack, oleh karena itu menjadi hambatan jika ini diulang dalam satu lingkaran.
Alternatif 3: Masukkan pointer ke buffer, dan biarkan pemanggil mengalokasikan buffer itu. Suka:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
Ini membawa lebih banyak upaya bagi penelepon. Saya juga memperhatikan bahwa alternatif ini memberi saya pilihan lain pada urutan argumen. Argumen mana yang harus saya miliki pertama dan terakhir? (sebenarnya enam kemungkinan)
Jadi, mana yang harus saya pilih? Adakah alasannya? Apakah ada semacam standar tidak tertulis di antara pengembang C?
sysctlbyname
di OS X dan iOS