2010-08-24 24 views
22

standart C kütüphanesinden fonksiyonları, dize manipülasyon için özellikle olanlar bir sürü ve (en önemlisi strcpy'nin), aşağıdaki prototip paylaşın:strcpy'nin() dönüş değeri

char *the_function (char *destination, ...) 

bu dönüş değeri Fonksiyonlar aslında sağlanan destination ile aynıdır. Neden gereksiz bir şey için dönüş değerini boşa harcıyorsun? Böyle bir işlevin geçersiz olması veya faydalı bir şey döndürmesi daha mantıklıdır. Bu neden olarak

Benim tek tahminim, örneğin daha kolay ve yuvaya daha uygun başka ifadede işlev çağrısı olmasıdır:

printf("%s\n", strcpy(dst, src)); 

bu deyim haklı, her akıllı nedenler var mıdır?

+10

Tahminin doğru, ama tabii ki bütün bu fonksiyonlar sonlandıran boş bayt için bir işaretçi döndürdü dilek ('O (n)' operasyonlarına bir sürü azaltacaktır 'O (1)'). –

+0

Çok doğru bir gözlem. Pek çok kişi sadece bir strlen() maliyetini anlamıyor. –

cevap

18

,

char* s = strcpy(malloc(10), "test"); 

mesela böyle bir şey yapmak mümkündür Yardımcı değişken kullanmadan malloc()ed belleğini bir değer atayın.

(bu örnek bellek koşulları dışında çökmesine olacak, en iyi olanı değil, ama fikir açıktır) da kod son derece kolay

+3

'char * s = strcpy (xmalloc (10, my_jmpbuf)," test ");' xmalloc ile başarısızlık 'longjmp' yapan bu idiom aklı başında yapar. –

+0

Teşekkür ederim Yossarian, bu şekilde çok mantıklı. Genel olarak, eğer hedef argümanı bir ifadeyse, o zaman dönüş değeri, bu ifadenin değerlendirilmiş sonucu olacağı için yararlı olabilir. –

+0

Muhtemelen, evet, çok aptalca, kesinlikle. Bir yardımcı değişkeni önleme arzusu, programınızın kötü bir şekilde bombalanacağı gerçeğinden çok daha ağır basmaktadır. Kullanmaktan daha iyi olursunuz (ya da yazmıyorsanız bile) 'strdup': http://stackoverflow.com/questions/252782/strdup-what-does-it-do-in-c/252802 # 252802. – paxdiablo

3

Tahmininizin doğru olduğuna inanıyorum, aramayı kolaylaştırır. Evan belirttiği gibi

1

it'i.

Dönüş değeri normalde AX kaydında kalır (zorunlu değildir, ancak çoğu durumda). Ve işlev başladığında hedef AX kaydına konur. Hedefi döndürmek için programcının ... kesinlikle bir şey yapması gerekmiyor! Sadece bulunduğu yerde bırakın.

Programcı, işlevi void olarak bildirebilir. Ama bu geri dönüş değeri zaten doğru yerde, sadece iade edilmek için bekliyor ve buna geri dönmek için ekstra bir talimat bile gerektirmiyor! İyileştirme ne kadar küçük olursa olsun, bazı durumlarda kullanışlıdır.

+2

Komik, ISO C standartları belgelerinde bir AX kaydından bahsetmiyorum :-) – paxdiablo

+0

Bu ayrıntı, derleyici uygulamasına ait olduğu için, ISO standardının kapsamadığı bir şey. Burada belirtildiği gibi x86 işlev çağrısı sözleşmesinin bir parçasıdır (https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions): "_Integer değerleri ve bellek adresleri EAX register_ içinde döndürülür" – Fernando

0

Bunun gerçekten yuva oluşturma amacıyla bu şekilde ayarlandığını düşünmüyorum, ancak daha fazla hata denetimi için. Bellek, standart kütüphane işlevlerinden hiçbirine hizmet etmiyorsa, kendi başına çok fazla hata yapar ve bu, strcpy çağrısı sırasında bir şeyin ters gidip gitmediğini belirlemek için daha mantıklı olur.

if(strcpy(dest, source) == NULL) { 
    // Something went horribly wrong, now we deal with it 
}