Memset () dönüş değerinin kullanımı nedir?


90

memset()void*her zaman işleve iletilen adresle aynı değeri döndürmek üzere bildirilir .

Dönüş değerinin faydası nedir? Neden geri dönmüyor void?



2
Dönüş değerinin kullanımı nedir strcat()? Bazen standart işlevler, oldukları gibi değil, belirtildikleri şeylerdir. belirtilir .
DevSolar

4
@MatthieuM .: Ayrıca, eşyaların iade edilmesiyle ilgili genellikle sıfır olmayan bir maliyet var. Dönüş değeri bir kayıt defterine sığsa bile, genellikle bu değeri kasaya yüklemeniz gerekir. Bunun bir maliyeti var, ancak küçük.
NPE

15
@sharptooth: "Tüm insanları öldür" işlevi elbette öldürülen insan sayısını döndürecektir.
indiv

2
@MatthieuM .: Sen böyle trivia hakkında endişe saymazlar ama ben kesinlikle olabilir. Sınırlı bir kaynak sistemi için bir derleyici yazıyorsam ne olur? Hmmm?
Thomas Eding

Yanıtlar:


36

İmza tüm diğer benzer fonksiyonları ile uyumludur: memcpy(), strcpy()vb hep bu tür fonksiyonlara zincir aramaları edebilmesine imkan vermek için yapılır ve başka şekilde ifadelerinde bu tür aramaları kullanmak düşündüm.

Bununla birlikte, geri dönüş değerini bu şekilde kullanmaya mecbur hissettiğim gerçek dünya durumuna asla rastlamadım.


122

Aşağıdaki gibi çağrı zincirleme için kullanılabilir:

char a[200];
strcpy(memset(a, 0, 200), "bla");

9
Evet, kesinlikle 'zincirleme' kullanım durumu.
Cartesius00

6
Cevabı destekledim çünkü ilginç bir durum. Ama gerçek hayatta memset ve strcpy çağrılarını ayrı tutmanın daha iyi olacağını düşünüyorum.
Tsvetomir Dimitrov

26
C programcıları okunamayan kodları severler, bu nedenle standart bir işlev tasarlarken sonsuz zincirlemeye izin vermek şarttır.
Chad Schouggins

@ChadSchouggins Bazı haskell kodunu okuyun ve c-programcılarının aslında oldukça kelimesi olduğunu biliyorsunuz;) (normal ifade "operatörü" = ~ düşünür) ...
BitTickler

Elbette bu örnekte strcpy, imleci kopyalanan sonuncuyu geçtikten sonra geri döndürmek daha mantıklı olurdu . memset(my_strcpy(a, "bla"), 0, a + 200);( C ++ 'da beğen std::copy_nve std::fill_nyap).
alfC

12

İşlevi başka bir işlev için argüman olarak kullanmak için, örneğin sprintf


1

Google'da memset'in ne döndüğünü görmek için bu soruyla karşılaştım.

Bir değeri test ettiğim bir kodum var, o zaman bu doğruysa, bir değerin sıfır olup olmadığını test edin.

C de sıfırları test etmenin tamamen taşınabilir bir yolu olmadığı için ortada memset çalıştırmalıyım.

Yani benim kodum:

if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )

Bu, önceki sorularda listelenen zincirleme amacına hitap eder, ancak bu tekniğin kullanımına bir örnektir.

Bunun iyi bir kodlama olup olmadığına karar vermeyi başkalarına bırakacağım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.