logo

C'de strdup () işlevi

Bu makalede, C'deki strdup() fonksiyonunun sözdizimini, örneğini, karmaşıklığını, avantajlarını ve dezavantajlarını öğreneceksiniz.

strdup() işlevi C programlama dilinde sağlanan bir dizeyi çoğaltır. İle bir dizeyi kabul eder boş sonlandırma bir argüman olarak. BT çıktılar kopya olan dinamik olarak ayrılmış yeni bir dizeye yönelik bir işaretçi (örn. Tam kopya ) giriş dizesinin.

strdup() işlevi bir parçası değil ortak C kütüphanesi . Ancak sıklıkla çeşitli platformlarda dize işleme yardımcı programlarının bir bileşeni olarak sunulur. Aşağıdaki şekilde tanımlanır:

Sözdizimi:

Aşağıdaki sözdizimine sahiptir:

 char *strdup(const char *str); 

Sebebi strdup() işlevi bir yaratmaktır kopya kopya belirli bir dizenin. Bir alır boş sonlandırılmış sicim cadde gibi onun argümanı ve yepyeni, dinamik olarak ayrılmış bir dizeye bir işaretçi döndürür. gerçek kopya otantik dizenin.

1'den 100'e kadar roma rakamları

İşte bir adım adım döküm nasıl strdup() genellikle çalışır:

  1. Fonksiyon şunu hesaplar: uzunluk girişin dize dizisi kullanmak strlen() işlevi . Yinelenen dizeyi depolamak için gereken bellek miktarına karar vermek için tamamlanır.
  2. Bir tahsis eder yeni hafıza bloğu tutmak için yinelenen dize kullanmak malloc() işlevi . Bellek bloğunun boyutuna şunlar dahil edilerek karar verilir: 1 uzunluğunda girilen dize . ekstra 1 için boş karakter ('') bu dizeyi sonlandırır.
  3. Eğer hafıza tahsisi dır-dir arızalı , strdup() işlevi aynı zamanda doğru bir şekilde a değerini döndürecektir boş işaretçisi ( malloc() aynısını yapar). incelenmesi strdup() işlevin dönüş değeri bu tür durumların ele alınması için çok önemlidir.
  4. fonksiyonun son çıktısı yinelenen dizeyi içeren yeni ayrılmış bellek bloğunun işaretçisidir.

Kullanırken aşağıdaki konulara dikkat etmeliyiz strdup() işlevi :

strdup() işlevi dinamik olarak tahsis eder hafıza üreme dizisi için. Bu nedenle, bu programcının sorumluluğu kilometrelerce uzaktayken bu hafızayı serbest bırakmak artık gevşek() karakteristiği . Belleğin boşaltılmaması bellek sızıntılarına neden olabilir.

kullanmaktan kaçınmak genellikle iyi bir seçimdir. strdup() işlevi büyük dizelerde veya bellek tahsisinin olacağı durumlarda ders . Beri strdup() işlevi Belleği dinamik olarak tahsis ettiğinden, yetersiz bir anımsama olmadan başarısız olabilir.

Programı:

 #include #include #include int main() { const char *original = 'Hello, world!'; char *duplicate = strdup(original); if (duplicate != NULL) { printf('Original string: %s
', original); printf('Duplicate string: %s
', duplicate); free(duplicate); // Release the dynamically allocated memory } else { printf('Memory allocation failed.
'); } return 0; } 

Çıktı:

 Original string: Hello, world! Duplicate string: Hello, world! 

Açıklama:

Temel başlık belgelerini ekleyin:

    stdio.h için kullanılır giriş/çıkış işlemleri . Dize.h dize işleme işlevleri için kullanılır. Stdlib.h için kullanılır dinamik bellek ayırma özellikler.

Değişkenleri tanımlayın:

  • Benzersiz, sabit bir dizeye yönelik bir işaretçidir 'Selam Dünya!' . Bu dize çoğaltmamız gereken dizedir.
  • kopya bir kişiye işarettir. İle oluşturulan yinelenen dizeyi kaydedecektir. strdup() .

strdup()'ı çağırın:

  • strdup() işlevi çağrılıp geçiyor orijinal dize olarak argüman . Bir yaratır kopya ile ilgili orijinal dize ve kopyalanan dizeye bir işaretçi döndürür. Bu İşaretçi yinelenen değişkene atanır.

Bellek ayırmanın başarılı olup olmadığını kontrol edin:

  • Program, kopyanın bir kopya olup olmadığını inceler. boş işaretçisi . Eğer strdup() işlevi yinelenen dize için anıların tahsis edilmesinde bir başarıydı, artık bir kopya olmayacak hükümsüz .

Orijinal ve yinelenen dizeleri yazdırın:

  • Eğer hafıza tahsisi bir dönüş vurmak , bu sistem şunları yazdırır: otantik Ve kopyalar dizeleri kullanarak printf() ifadeleri . %s biçim belirtici alışkın dizeleri yazdır .

Ücretsiz dinamik olarak ayrılmış bellek:

ikili arama ağacı örneği
  • Dizeleri yazdırdıktan sonra bu sistem çağırır ücretsiz (kopya) başlatmak için dinamik olarak ayrılmış bellek . Bu adım, anı sızıntılarından uzak durmak için kritik öneme sahiptir.

Bellek ayırma hatasını yönetin:

  • Bellek tahsisi başarısız olursa (örn. strdup() fonksiyon alt sırt a boş işaretçisi ), program bir çıktı verir başarısızlık mesajı bellek tahsisinin başarısız olduğunu gösterir.

Main()'dan dönüş:

  • program 0 değerini döndürür , belirten başarılı uygulama , çalışan cihaza.

Genel olarak, bu uygulama aşağıdakilerin kullanımını göstermektedir: strdup() işlevi bir dizeyi kopyalamak için, testler Başarılı bir anı tahsisi için ve baskılar orijinal ve kopya dizeleri. Aynı zamanda anı tahsisinin başarısız olduğu durumu da ele alır.

Karmaşıklık analizi:

zaman Ve uzay karmaşıklığı arasında strdup() özelliği şu şekilde analiz edilebilir:

Zaman Karmaşıklığı:

  • zaman karmaşıklığı arasında strdup() işlevi doğrusal olarak kabul edilebilir veya Açık) , hangisinde N uzunluğu giriş dizesi . Bunun nedeni strdup() iki temel işlemi gerektirir:
  • Girilen dizenin süresinin hesaplanması: strlen() özelliği genellikle giriş dizesinin uzunluğuna karar vermek için kullanılır. İle karşılaşana kadar dizenin karakterleri üzerinde yinelenir. boş birey ('') . Bu işlem O(n) zaman karmaşıklığı , hangisinde N dönemi sicim .Dize kopyalanıyor: kopyalama işlemi aracılığıyla elde edilen strcpy() işlevi ya da memcpy() işlevi almak O(n) zaman karmaşıklığı güzelce. Girilen dizenin her bir bireyi üzerinde yinelemeyi ve onu yeni tahsis edilen anımsama bloğuna kopyalamayı gerektirir.
  • Bu nedenle, strdup() fonksiyonunun genel zaman karmaşıklığı şu şekilde tahmin edilebilir: Açık) , Neresi N dönemi giriş dizesi .

Uzay Karmaşıklığı:

  • uzay karmaşıklığı arasında strdup() işlevi aynı şekilde doğrusaldır veya Açık) , hangisinde N süresi giriş dizesi . Çünkü strdup() çoğaltma dizesi için dinamik olarak bellek ayırır ve kopyalanan karakterleri depolamak için ekstra bir alan gerektirir.
  • Ayrılan bellek miktarına girilen dizenin ölçeği kullanılarak karar verilir. n + 1 , Neresi N bu uzunluk arasında giriş dizesi . Ekstra '+1' için boş birey ('') . Ekte yer almaktadır yinelenen dize mil olduğundan emin olmak için istifa ediyorum boş sonlandırılmış .
  • Bu nedenle genel uzay karmaşıklığı strdup()'ın değeri Açık) , hangisinde N süresi giriş dizesi .

Şunu belirtmek gerekir ki gerçek zamanlı ve alan ihtiyaçları faktörlerden etkilenebilir, bellek yönetimi yükü, makineye özel optimizasyonlar ve C kütüphanesinin uygulama detaylarının kullanılması. Bunlar karmaşıklıklar genel performans özelliklerini tanımak için tercih edilen bir kılavuz olarak işlev görür. strdup() işlevi .

C'deki strdup()'ın özellikleri:

strdup() işlevi C'de aşağıdaki özellikler bulunur:

Dize Çoğaltılması: Önemli olan motif strdup() işlevi belirli bir dizenin çoğaltılmış bir kopyasını oluşturmaktır. Yinelenen dize için bellek ayırır ve orijinal dizenin içeriğini yeni ayrılan bellek bloğuna kopyalar.

java'da yığın nedir

Dinamik Bellek Tahsisi: strdup() işlevi için belleği dinamik olarak ayırır. yinelenen dize kullanmak malloc() karakteristiği . Belleğin çalışma zamanında tahsis edildiği ve kullanılarak başlatılabilen bu yöntem ücretsiz() özelliği şimdi buna gerek yok.

Boş Sonlandırma: yinelenen dize tarafından yaratıldı strdup() işlevi aynı şekilde boş sonlandırılmış , tıpkı otantik dize . boş birey ('') dizenin çıkışını işaretlemek için çoğaltma dizesinin tepesine eklenir.

Döndürülen İşaretçi: strdup() işlevi içeren yeni tahsis edilen anımsama bloğuna bir işaretçi döndürür. yinelenen dize . İşaretçi yinelenen dizenin ilk bireyini işaret eder.

Hata yönetimi: Anı tahsisi başarısız olursa, strdup() işlevi bir döndürür boş işaretçisi başarısızlığı ifade etmek için. Dönüş değerinin test edilmesi strdup() işlevi Bu tür senaryoları ele almak ve sizi başarıyla tahsis edilmemiş belleğe erişimden kurtarmak çok önemlidir.

Taşınabilirlik: rağmen strdup() işlevi her zaman olağan C kütüphanesinin bir parçası değildir, genellikle birçok sistemde dize işleme yardımcı programlarının bir parçası olarak bulunur. Ancak kullanılabilirliği duruma bağlı olarak değişebilir. özel platform veya derleyici .

Bellek Yönetimi Sorumluluğu: Kullanırken strdup() işlevi , programcının dinamik olarak ayrılan belleği kullanması için serbest bırakması gerekir. ücretsiz() işlevi istenmediği anda. Bunu başaramamak hafıza sızıntılarına yol açabilir ve programın yıllar içinde aşırı hatıraları yutmasına neden olabilir.

Standart Dize İşlevleriyle Uyumluluk: yinelenen dize tarafından iade edildi strdup() işlevi çok uzak olduğu için farklı modaya uygun C string özellikleriyle kullanılabilir. null ile sonlandırılmış dize . İçeri girmesine izin veriyor temiz entegrasyon dizeleri yöneten mevcut kodla.

C'de strdup()'ın faydaları:

Pek çok faydası var strdup() işlevi C'de. strdup() fonksiyonunun bazı temel faydaları şunlardır:

Kolaylık ve Basitlik: strdup() işlevi birleştirerek bir dizeyi kopyalama işlemini kolaylaştırır hafıza tahsisi Ve dize kopyalama yöntemleri tek bir işlev çağrısına dönüştürün. Sonuç olarak, karmaşıklık Ve okunabilirlik kodun her ikisi de azaldı ve geliştiriciler bu faaliyetleri gerçekleştirmek için benzersiz kod yazmaktan kurtulur.

Kod Okunabilirliği ve Sürdürülebilirliği: Kullanmak strdup() işlevi , kod daha okunabilir ve kendini açıklayıcı hale gelir. İşlev çağrısı aslında bir dizeyi çoğaltmayı ve kodun okunabilirliğini artırmayı amaçlamaktadır. Ayrıca, kılavuz belleği tahsisi ve dize kopyalamayla ilişkili hataların ortaya çıkma olasılığını da azaltır ve bu da daha fazla bakımı yapılabilir kod sağlar.

Kodun Yeniden Kullanılabilirliği: strdup() işlevi yeniden kullanılabilir kod katkı maddelerinin oluşturulmasına olanak tanır. Bir dizeyi doğrudan ayrı bir özelliğe kopyalamaya yönelik mükemmel kararı kapsayarak, işlevi kod tabanınızın birden fazla öğesinde zahmetsizce yeniden kullanabilirsiniz. Kod modülerliğini destekler ve fazlalığı azaltır.

Bellek Tahsisi ile Esneklik: Beri strdup() işlevi yinelenen dize için dinamik olarak bellek ayırır, farklı uzunluklardaki dizelerin yönetilmesinde esneklik sağlar. Sabit boyutlu arabelleklerin boyut sınırları konusunda endişelenmenize gerek yoktur. Bilinmeyen veya değişken uzunluktaki giriş dizelerini yönetirken özellikle kullanışlıdır.

Arabellek Taşmalarından Kaçınma: Arabellek taşmaları Bilgi, ayrılan hafıza alanını aştığında meydana gelir ve bu da güvenlik açıklarına ve uygulama çökmelerine neden olabilir. Kullanmak strdup() işlevi işlevi, tamamen girilen dizenin süresine dayalı olarak belleği rutin olarak ayırdığından, arabellek taşması sorunlarından kaçınabilirsiniz.

Bellek Optimizasyonu: Bazı durumlarda, strdup() işlevi bellek optimizasyonuyla sonuçlanabilir. Örneğin, birden fazla değişken eşit dize içeriğine işaret ettiğinde, dizeyi şununla çoğaltmak: strdup() tüm bellek içeriğini kopyalamak yerine her değişken için ayrı bellek ayırarak bellek kullanımını azaltabilir.

C'deki strdup() işlevinin Sınırları/Dezavantajları:

strdup() işlevi C'de yaygın olarak kullanılan C dili tarafından tanımlanan belirli bir sınır yoktur. Ancak temel cihaz ve mevcut varlıklar, davranışını ve sınırlarını motive eder. Kullanımı sırasında limitlerle ilgili bazı konular şunlardır: strdup() işlevi :

Kullanılabilir Bellek: için bir numaralı kısıtlamadır. strdup() işlevi bu kullanılabilirlik Sistemdeki hatıralar. Beri strdup() işlevi kullanarak çoğaltma dizesi için anıları dinamik olarak ayırır. malloc() tahsis için mevcut olan anımsama miktarı, kopyalanabilecek dizenin ölçeğini kısıtlayabilir. Yinelenen dizeyi tahsis etmek için yeterli bellek yoksa, strdup() işlevi başarısız olacak ve geri dönecek boş işaretçisi .

Maksimum Dizi Uzunluğu: Bir dizenin çoğaltılabilecek maksimum süresi strdup() işlevi tahsis edilebilecek anımsama bloğunun ölçeği aracılığıyla belirlenir. Maksimum sistemlerde, dinamik olarak tahsis edilen bir anımsama bloğunun maksimum boyutu, mevcut fiziksel bellek ve makinenin yapısı gibi faktörler tarafından belirlenir. size_t veri türü Anı bloklarının ölçeğini temsil etmek için kullanılan , çoğu dize periyoduna bir sınır getirebilir.

Uygulamaya Özel Sınırlar: strdup() özelliği sistem veya kullanılan C kütüphanesi aracılığıyla uygulamaya özel sınırlamalar uygulanabilir. Bu sınırlar belirli sistemler ve derleyiciler arasında değişiklik gösterebilir. Uygulama yoluyla uygulanan belirli sınırları anlamak için belgelere veya platforma özgü varlıklara başvurmanız önerilir.

Güvenlik Hususları: Kullanırken strdup() işlevi Aşağıdakiler de dahil olmak üzere yetenek güvenliği risklerinin farkında olmak hayati önem taşımaktadır: arabellek taşması güvenlik açıkları. Beri strdup() işlevi girilen dizenin süresine göre anımsamayı tahsis eder; girilen dize güvenilmiyorsa veya bilinmeyen bir döneme aitse, arabellek taşmalarını veya farklı güvenlik açıklarını önlemek için girişi doğrulamak ve sterilize etmek çok önemlidir.

Çoklu iş parçacığı ve Eşzamanlılık: Kullanırken strdup() işlevi çok iş parçacıklı veya eş zamanlı bir ortamda uygun senkronizasyon ve iş parçacığı güvenliğinin sağlanması kritik öneme sahiptir. Birkaç iş parçacığı dizeleri aynı anda çoğaltmaya çalışırsa, yarış koşulları Ve hafıza bozulması Ortaya çıkabilir. Uygun senkronizasyon mekanizmaları , örneğin kilitler veya iş parçacığı güvenli bellek ayırma Bu sıkıntıların azaltılması için kullanılması gerekmektedir.

Linux kısayolları

Bellek Parçalanması: Sıklıkla kullanılması strdup() işlevi katkıda bulunabilir hafıza parçalanması mesai. Bellek parçalanması çözülmüş hafıza ikiye bölündüğünde olur küçük , bitişik olmayan bloklar, bunu zorlaştırıyor büyük bellek bloklarını tahsis edin . Kullanılabilir hafıza yeterli olsa da, şüphesiz hafıza tahsisinde bozulmalara neden olabilir. Gibi stratejiler anı havuzu veya özel hatıra tahsisatçılar parçalanmanın azaltılmasına yardımcı olabilir.

Sonuç olarak, sınırların strdup() işlevi genellikle cihazda bulunması gereken hafızaya, dinamik olarak tahsis edilen hafıza bloklarının uzunluğuna ve uygulamaya özel düzenlemelere göre belirlenir. Bellek ayırma sorunlarıyla uğraşmak ve kullanırken güvenlik kaygılarını dikkate almak strdup() işlevi dizeleri kopyalamak kritik öneme sahiptir.