C programlarımda genellikle ADT'lerimin dize olarak temsilini yapmak için bir yola ihtiyacım var. Herhangi bir şekilde ekrana dizesini yazdırmak zorunda olmasam bile, hata ayıklama için böyle bir yöntem olması temiz. Yani bu tür bir işlev genellikle ortaya çıkar.
char * mytype_to_string( const mytype_t *t );
Aslında ben dize dönmek için bellek işlemek için burada (en az) üç seçenek olduğunu fark.
Alternatif 1: Dönüş dizesini işlevdeki statik karakter dizisinde saklamak. Dize her çağrıda üzerine yazılması dışında çok düşünmeye gerek yok. Bu bazı durumlarda bir sorun olabilir.
Alternatif 2: Öbek üzerindeki dizeyi işlevin içindeki malloc ile ayırın. Gerçekten temiz beri ben bir tampon veya üzerine yazma boyutunu düşünmek gerekmez. Ancak, bittiğinde dize free () hatırlamak zorunda, ve sonra ben de serbest bir şekilde geçici bir değişken atamak gerekir. ve sonra yığın tahsisi yığın tahsisinden çok daha yavaştır, bu nedenle bu döngüde tekrarlanırsa bir darboğaz olacaktır.
Alternatif 3: İşaretçiyi bir tampona iletin ve arayanın bu arabelleği ayırmasına izin verin. Sevmek:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
Bu, arayan kişiye daha fazla çaba getirir. Ayrıca bu alternatifin bana argümanların sırası konusunda başka bir seçenek sunduğunu fark ettim. İlk ve son olarak hangi tartışmam gerekir? (aslında altı olasılık)
Peki hangisini tercih etmeliyim? Herhangi bir nedenle? C geliştiricileri arasında bir tür yazılı olmayan standart var mı?
sysctlbyname
OS X ve iOS'ta