C'de memset() işlevi, bir baytlık değeri bir bellek bloğu bayt baytına ayarlamak için kullanılır. Bu işlev, belirli bir değerle bir bellek bloğu baytının bayt bayt başlatılması için kullanışlıdır. Bu yazımızda bu fonksiyonun nasıl kullanılabileceğini detaylı olarak göreceğiz. Öyleyse başlayalım.
Başlık dosyası:
1 | dize.h |
Sözdizimi:
1 | void *memset(void *str, int ch, size_t n) |
Bu fonksiyon ilk n tarafından gösterilen bellek bloğunun baytları cadde tarafından ch.
Argümanlar:
İşlev 3 bağımsız değişken alır:
- cadde: Bu, belleğin ayarlanacağı bellek konumunun işaretçisidir. Bu bir geçersiz işaretçidir, bu nedenle herhangi bir bellek bloğu türünü ayarlayabiliriz, ancak bellek bayt bayt olarak ayarlanacaktır.
- ch: Bu, bellek bloğuna kopyalanacak değerdir. Bu bir tamsayı değeridir, ancak kopyalanmadan önce işaretsiz bir karaktere dönüştürülür.
- n: Bu, bellek bloğunda ayarlanan bayt sayısıdır.
Dönüş değerleri:
memset() değeri ayarlamaya başladığı bellek bloğunun ilk adresini döndürür.
Örnekler:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //Örnek 1.c #Dahil etmek #Dahil etmek int ana() char str[30] = "ABCD EFGH"; printf("Memset'ten Önce => %s",str); memset(str,'x',3); printf("\nMemset'ten sonra => %s\n",str); 0 döndür; |
Örnek1'de.c, 30 boyutunda bir karakter dizisi ilan ettik. Ardından “ABCD EFGH” dizesiyle başlattık.” Memset işlevinde str, 'x' ve 3 argümanını geçtik. Böylece, str ile gösterilen bellek bloğu ilk 3 karakteri 'x ile sıfırlayacaktır.' Memset'ten sonra, hafızayı yazdırdığımızda “xxxD EFGH” alacağız.”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //Örnek2.c #Dahil etmek #Dahil etmek int ana() char str[30] = "ABCD EFGH"; printf("Memset'ten Önce => %s",str); memset(str+4,'x',3); printf("\nMemset'ten sonra => %s\n",str); 0 döndür; |
Örnek2'de.c, str+4'ü memset işlevine geçtik. Böylece, str'nin 4. konumundan sonra hafızayı sıfırlar. Memset'ten sonra hafızayı yazdırdığımızda “ABCDxxxGH.”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // Örnek3.c #Dahil etmek #Dahil etmek int ana() int dizi[5],i; memset(dizi,10,5*sizeof(dizi[0])); printf("\narr Elemanları => \n"); for(i=0;i<5;i++) printf("%d\t",dizi[i]); printf("\n"); 0 döndür; |
Örnek3'te.c, 5 boyutunda bir tamsayı dizisi ilan ettik ve onu 10 ile başlatmaya çalışıyoruz. Ancak çıktıdan dizinin 10 ile başlatılmadığını gördük; bunun yerine “168430090” değerini aldık. Bunun nedeni, tamsayı değerinin bir bayttan büyük olması ve memset işlevinin kopyalanmadan önce değeri işaretsiz bir karaktere dönüştürmesidir. Şimdi 168430090 değerini nasıl alacağımızı göreceğiz.
10'un ikili gösterimi 00000000 00000000 00000000 00001010'dur.
Tamsayı işaretsiz karaktere dönüştürüldüğünde, daha düşük 1 bayt kabul edilir. Bu nedenle, 10 imzasız karaktere dönüştürüldüğünde, ikili gösterim 00001010'dur.
memset() işlevi bellek konumunu bayt bayt ayarlar. Yani toplam 4 bayt olacaktır: 00001010 00001010 00001010 00001010.
4 baytlık ikili gösterimin ondalık değeri 168430090'dır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // Örnek4.c #Dahil etmek #Dahil etmek int ana() int dizi[5],i; memset(dizi,0,5*sizeof(dizi[0])); printf("\narr Elemanları => \n"); for(i=0;i<5;i++) printf("%d\t",dizi[i]); printf("\n"); 0 döndür; |
Örnek4'te.c, tamsayı dizisini 0 ile başlattık. 0'ın ikili gösteriminin tüm bitleri 0'dır. Böylece dizi 0 ile başlatılır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // Örnek5.c #Dahil etmek #Dahil etmek int ana() int dizi[5],i; memset(dizi,-1,5*sizeof(dizi[0])); printf("\narr Elemanları => \n"); for(i=0;i<5;i++) printf("%d\t",dizi[i]); printf("\n"); 0 döndür; |
Örnek5'te.c, tamsayı dizisini 0 ile başlattık. -1'in ikili gösteriminin tüm bitleri 1'dir. Böylece dizi -1 ile başlatılır.
Sonuç:
Bu yazıda, memset fonksiyonunu kullanarak bir bellek bloğunun değerini nasıl verimli bir şekilde başlatabileceğimizi veya ayarlayabileceğimizi gördük. Herhangi bir karakteri ve 0 veya -1'i bir tamsayı değeri olarak bir bellek bloğuna ayarlayabiliriz. Memset işlevi, bir döngü kullanarak konumu basitçe ayarlamakla karşılaştırıldığında, büyük bir bitişik bellek yığını ayarlamak için daha hızlıdır.