logo

strdup()-funktio C:ssä

Tässä artikkelissa opit C:n strdup()-funktiosta ja sen syntaksista, esimerkistä, monimutkaisuudesta, eduista ja haitoista.

The strdup()-funktio kopioi C-ohjelmointikielellä tarjotun merkkijonon. Se hyväksyy merkkijonon, jossa on a nolla lopetus argumenttina. Se ulostulot osoitin uuteen dynaamisesti varattuun merkkijonoon, joka on kaksoiskappale (eli an tarkka kopio ) syötemerkkijonosta.

The strdup()-funktio ei ole osa yhteinen C-kirjasto . Sitä tarjotaan kuitenkin usein osana merkkijonojen manipulointiapuohjelmia eri alustoilla. Se määritellään seuraavasti:

Syntaksi:

Siinä on seuraava syntaksi:

 char *strdup(const char *str); 

Motiivi strdup()-funktio on luoda a kaksoiskopio annetusta merkkijonosta. Se kestää a nolla-päätetty merkkijono str kuten sen argumentti ja palauttaa osoittimen aivan uuteen dynaamisesti varattuun merkkijonoon, joka on todellinen kopio aidosta merkkijonosta.

bash jaettu merkkijono erottimella

Tässä on a vaiheittainen erittely kuinka strdup() yleensä toimii:

  1. Funktio laskee pituus sisäänkäynnistä string str käyttämällä strlen()-funktio . Se on valmis päättämään, kuinka paljon muistia tarvitaan kaksoismerkkijonon tallentamiseen.
  2. Se jakaa a uusi muistilohko pitämään päällekkäinen merkkijono käyttämällä malloc()-funktio . Muistilohkon koko päätetään mukaan lukien 1 pituudessa syötetty merkkijono . The ylimääräinen 1 on varten tyhjä merkki ('') joka päättää merkkijonon.
  3. Jos muistin varaus On epäonnistunut , strdup()-funktio palauttaa myös oikein a nolla osoitin ( malloc() tekee samoin). Tutkimalla strdup() funktion palautusarvo on olennainen tällaisten olosuhteiden käsittelyssä.
  4. The toiminnon lopullinen tulos on osoitin uuteen varattuun muistilohkoon, joka sisältää kaksoismerkkijonon.

Meidän on huomioitava seuraavat ongelmat käyttäessämme strdup()-funktio :

The strdup()-funktio jakaa dynaamisesti muisti toistomerkkijonoa varten. Siksi se on ohjelmoijan vastuulla vapauttaa tämän muistin, kun se on mailia nyt ei halunnut käyttöä löysä() ominaisuus . Muistin vapauttamatta jättäminen voi aiheuttaa muistivuotoja.

Yleensä on hyvä valinta välttää sen käyttöä strdup()-funktio suurilla merkkijonoilla tai tilanteissa, joissa muistin varaus on aihe . Koska strdup()-funktio dynaamisesti varaa muistia, se voi epäonnistua ilman riittämätöntä muistoa.

Ohjelmoida:

 #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; } 

Lähtö:

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

Selitys:

Sisällytä tärkeät otsikkoasiakirjat:

    stdio.h käytetään syöttö/tulostustoiminnot . String.h käytetään merkkijonojen käsittelytoimintoihin. Stdlib.h käytetään dynaaminen muistin varaus ominaisuudet.

Määrittele muuttujat:

  • Unique on osoitin vakiomerkkijonoon 'Hei maailma!' . Tämä merkkijono on se, joka meidän on kopioitava.
  • The kopio on osoitin henkilöön. Se tallentaa kanssa luodun merkkijonon kaksoiskappaleen strdup() .

Soita strdup():

  • The strdup()-funktio kutsutaan ohittaen alkuperäinen merkkijono kuten an Perustelu . Se luo a kopio / alkuperäinen merkkijono ja palauttaa osoittimen monistettuun merkkijonoon. Tämä osoitin on määritetty kaksoismuuttujalle.

Tarkista, tuleeko muistin varauksesta osuma:

  • Ohjelma tutkii, onko kaksoiskappale a nolla osoitin . Jos strdup()-funktio oli osuma muistutuksen osoittamisessa kaksoismerkkijonolle, kopiota ei nyt tehdä tyhjä .

Tulosta alkuperäiset ja päällekkäiset merkkijonot:

  • Jos muistin varaus kääntyy a osuma , tämä järjestelmä tulostaa aito ja kopioita merkkijonoja käyttämällä printf() -lauseet . The %s muotomäärittäjä on tapana tulostaa merkkijonoja .

Vapaa dynaamisesti varattu muisti:

  • Kun merkkijonot on tulostettu, tämä järjestelmä kutsuu ilmainen (kaksoiskappale) käynnistääksesi dynaamisesti varattu muisti . Tämä vaihe on kriittinen välttääksesi muistovuotoja.

Käsittele muistin varausvirhe:

  • Jos muistin varaus epäonnistui (ts strdup() toiminto alaselän a nolla osoitin ), ohjelma tulostaa a virheilmoitus osoittaa, että muistin varaus epäonnistui.

Paluu main():

  • Ohjelma palauttaa 0 , osoittaa onnistunut toteutus , toimivaan laitteeseen.

Kaiken kaikkiaan tämä sovellus osoittaa, että strdup()-funktio kopioida merkkijono, testejä onnistuneesta muistojen jakamisesta ja tulostaa autenttiset ja kopioitavat merkkijonot. Se käsittelee myös tilanteen, jossa muistojen allokointi epäonnistuu.

Monimutkaisuusanalyysi:

The aika ja tilan monimutkaisuus -lta strdup()-ominaisuus voidaan analysoida seuraavasti:

Aika monimutkaisuus:

  • The aika monimutkaisuus -lta strdup()-funktio voidaan pitää lineaarisena tai Päällä) , jossa n on pituus syötemerkkijono . Se johtuu tosiasiasta strdup() sisältää kaksi päätoimintoa:
  • Syötetyn merkkijonon keston laskeminen:The strlen()-ominaisuus käytetään yleensä määrittämään syötemerkkijonon pituus. Se toistuu merkkijonon merkkejä, kunnes se kohtaa tyhjä yksilö ('') . Tämä operaatio kestää O(n) ajan monimutkaisuus , jossa n on ajanjakso merkkijono .Merkkijonon kopioiminen:The kopiointitoiminto kautta saavutettu strcpy()-funktio tai memcpy()-funktio kestää O(n) ajan monimutkaisuus yhtä hienosti. Se edellyttää syötetyn merkkijonon jokaisen yksilön iteroinnin ja sen kopioimisen äskettäin varattuun muistutuslohkoon.
  • Siksi strdup():n kokonaisaika monimutkaisuus voidaan arvioida seuraavasti Päällä) , missä n on ajanjakso syötemerkkijono .

Tilan monimutkaisuus:

  • The tilan monimutkaisuus -lta strdup()-funktio on myös lineaarinen tai Päällä) , jossa n on kesto syötemerkkijono . Se on koska strdup() varaa dynaamisesti muistia toistomerkkijonolle, mikä vaatii ylimääräisen alueen kopioitujen merkkien ostamiseen.
  • Varatun muistin määrä päätetään syötetyn merkkijonon asteikon perusteella, n + 1 , missä n on pituus -lta syötemerkkijono . Ylimääräinen '+1' on varten tyhjä yksilö ('') . Se on liitteenä päällekkäisiä merkkijonoja lopettaa varmistaaksesi, että se on mailia nolla-päätetty .
  • Siksi kokonaisuus tilan monimutkaisuus strdup() on Päällä) , jossa n on kesto syötemerkkijono .

On syytä huomata, että reaaliaika ja tilantarve voi kärsiä tekijöistä, muistinhallinnan lisäkustannukset, konekohtaiset optimoinnit ja C-kirjaston käyttöönoton yksityiskohdat. Nämä monimutkaisuus toimii ensisijaisena ohjeena tunnistaaksesi laitteen yleiset suorituskykyominaisuudet strdup()-funktio .

Strdup():n ominaisuudet C:ssä:

The strdup()-funktio C:llä on seuraavat ominaisuudet:

erikoismerkkien nimi

Merkkijonojen kopiointi: Tärkeä motiivi strdup()-funktio on luoda kopio annetusta merkkijonosta. Se varaa muistia päällekkäiselle merkkijonolle ja kopioi autenttisen merkkijonon sisällön äskettäin varattuun muistilohkoon.

mikä on pino javassa

Dynaaminen muistin varaus: The strdup()-funktio varaa dynaamisesti muistia päällekkäinen merkkijono käyttää malloc()-ominaisuus . Tämä menetelmä, jossa muisti varataan ajon aikana ja voidaan käynnistää käyttämällä ilmainen()-ominaisuus kun sitä nyt ei tarvita.

Tyhjä irtisanominen: The päällekkäinen merkkijono jonka on luonut strdup()-funktio on samoin nolla-päätetty , aivan kuten aito merkkijono . The tyhjä yksilö ('') on liitetty toistomerkkijonon yläosaan merkkijonon lopettamisen merkiksi.

Palautettu osoitin: The strdup()-funktio palauttaa osoittimen äskettäin varattuun muistutuslohkoon, joka sisältää päällekkäinen merkkijono . Osoitin osoittaa kaksoismerkkijonon ensimmäiseen yksilöön.

Virheiden käsittely: Jos muistojen allokointi epäonnistuu, strdup()-funktio palauttaa a nolla osoitin osoittamaan epäonnistumista. Testataan palautusarvoa strdup()-funktio tällaisten skenaarioiden käsitteleminen ja välttäminen onnistuneesti varaamattoman muistin käyttämiseltä on ratkaisevan tärkeää.

Siirrettävyys: vaikkakin strdup()-funktio ei aina ole osa tavallista C-kirjastoa, se on yleensä saatavilla monissa järjestelmissä osana merkkijonojen käsittelyapuohjelmia. Sen saatavuus voi kuitenkin vaihdella riippuen tietty alusta tai kääntäjä .

Vastuu muistinhallinnasta: Kun käytät strdup()-funktio , ohjelmoijan on irrotettava dynaamisesti varattu muisti free()-funktio heti kun sitä ei haluta. Jos tätä ei saavuteta, seurauksena voi olla muistivuotoja ja ohjelman tarkoitus voi olla liiallinen muisto vuosien mittaan.

Yhteensopivuus standardijonofunktioiden kanssa: The päällekkäinen merkkijono palauttanut strdup()-funktio voidaan käyttää eri trendikkäiden C-merkkijonojen kanssa, koska se on kaukana a nollapäätteinen merkkijono . Se päästää sisään puhdas integraatio nykyisellä koodilla, joka käsittelee merkkijonoja.

Strdup():n edut C:ssä:

Siitä on useita etuja strdup()-funktio C. Joitakin strdup()-funktion tärkeimpiä etuja ovat seuraavat:

Mukavuus ja yksinkertaisuus: The strdup()-funktio virtaviivaistaa merkkijonon kopiointiprosessia yhdistämällä muistin varaus ja merkkijonojen kopiointi menetelmät yhdeksi funktiokutsuksi. Tämän seurauksena monimutkaisuus ja luettavuus koodista ovat molemmat vähentynyt , ja kehittäjät eivät tarvitse kirjoittaa ainutlaatuista koodia näiden toimintojen suorittamiseksi.

Koodin luettavuus ja ylläpidettävyys: Käyttämällä strdup()-funktio , koodista tulee luettavampi ja itsestään selvä. Funktiokutsun tarkoituksena on todellakin kopioida merkkijono, mikä parantaa koodin luettavuutta. Se myös vähentää opasmuistin varaamiseen ja merkkijonojen kopioimiseen liittyvien virheiden lisäämisen mahdollisuutta, mikä johtaa ylimääräiseen ylläpidettävään koodiin.

Koodin uudelleenkäyttö: The strdup()-funktio mahdollistaa uudelleenkäytettävien koodilisäaineiden luomisen. Kapseloimalla erinomaisen harkinnan merkkijonon monistamisesta erilliseen ominaisuuteen, voit käyttää funktiota vaivattomasti uudelleen useissa koodikantaasi elementeissä. Se edistää koodin modulaarisuutta ja vähentää redundanssia.

Muistin varauksen joustavuus: Koska strdup()-funktio varaa dynaamisesti muistia päällekkäiselle merkkijonolle, se tarjoaa joustavuutta eripituisten merkkijonojen hallinnassa. Sinun ei tarvitse huolehtia suunnilleen kiinteän kokoisten puskurien mittarajoista. Se on erityisen hyödyllinen, kun hallitaan tuntemattomien tai vaihtelevan pituisia syöttöjonoja.

sisältää java-menetelmän

Puskurin ylivuotojen välttäminen: Puskuri vuotaa yli tapahtuu, kun tiedot ylittävät varatun muistutustilan, mikä voi johtaa tietoturva-aukoihin ja sovellusten kaatumiseen. Käyttämällä strdup()-funktio , voit välttää puskurin ylivuotoongelmia, koska funktio varaa rutiininomaisesti muistia täysin syötetyn merkkijonon keston perusteella.

Muistin optimointi: Joissakin tapauksissa käyttämällä strdup()-funktio voi johtaa muistin optimointiin. Esimerkiksi kun useat muuttujat osoittavat samaan merkkijonon sisältöön, merkkijono kopioidaan strdup() voi vähentää muistin käyttöä varaamalla erillisen muistin kullekin muuttujalle sen sijaan, että monistaisi koko muistin sisällön.

Strdup():n rajat/haitat C:ssä:

The strdup()-funktio C-kielellä ei ole erityisiä rajoja, joita C-kielellä on laajalti määritelty. Kuitenkin taustalla oleva laite ja käytettävissä oleva omaisuus motivoivat sen käyttäytymistä ja rajoituksia. Tässä on joitakin kysymyksiä, jotka koskevat rajoituksia käytön aikana strdup()-funktio :

Käytettävissä oleva muisti: Rajoitus numero yksi strdup()-funktio on saatavuus muistelmasta järjestelmässä. Koska strdup()-funktio varaa dynaamisesti muiston toistomerkkijonolle käyttämällä malloc() , allokoitavissa olevien muistojen määrä voi rajoittaa monistettavan merkkijonon laajuutta. Jos muisti ei riitä päällekkäisen merkkijonon varaamiseen, strdup()-funktio epäonnistuu ja palaa a nolla osoitin .

Merkkijonon enimmäispituus: Merkkijonon enimmäisjakso, joka voidaan kopioida strdup()-funktio määräytyy jaettavissa olevan muistolohkon mittakaavan perusteella. Maksimijärjestelmissä dynaamisesti allokoidun muistolohkon maksimikoko määräytyy tekijöistä, kuten käytettävissä olevasta fyysisesta muistista ja koneen rakenteesta. The size_t tietotyyppi , jota käytetään edustamaan muistolohkojen skaalaa, voi asettaa rajan suurimmalle merkkijonojaksolle.

Käyttöönottokohtaiset rajoitukset: The strdup()-ominaisuus Käytettävän järjestelmän tai C-kirjaston kautta saattaa olla toteutuskohtaisia ​​rajoituksia. Nämä rajat voivat vaihdella tiettyjen järjestelmien ja kääntäjien välillä. On suositeltavaa tutustua dokumentaatioon tai alustan ainutlaatuisiin resursseihin, jotta voit havaita käyttöönoton asettamat erityiset rajoitukset.

Turvallisuusnäkökohdat: Kun käytät strdup()-funktio , on erittäin tärkeää olla tietoinen valmiuksien turvallisuusriskeistä, mukaan lukien puskurin ylivuoto haavoittuvuuksia. Koska strdup()-funktio allokoi muistutuksen syötetyn merkkijonon keston perusteella, jos syötetty merkkijono on epäluotettava tai sen jakso on tuntematon, on tärkeää vahvistaa ja puhdistaa syöte puskurin ylivuodon tai erilaisten turvallisuushaavoittuvuuksien estämiseksi.

Monisäikeisyys ja samanaikaisuus: Kun käytät strdup()-funktio monisäikeisessä tai samanaikaisessa ympäristössä on tärkeää varmistaa asianmukainen synkronointi ja lankojen turvallisuus. Jos useat säikeet yrittävät monistaa merkkijonoja samanaikaisesti, kilpailuolosuhteet ja muistin korruptio voi syntyä. Oikeat synkronointimekanismit , kuten lukot tai säikeisuojattu muistin varaus , on käytettävä näiden ongelmien lievittämiseen.

Muistin pirstoutuminen: Toistuva käyttö strdup()-funktio voi myötävaikuttaa muistin pirstoutuminen ajan myötä. Muistin pirstoutuminen tapahtuu, kun kiinnittämätön muisti jaetaan pieni , ei-vierekkäiset lohkot, tekee siitä haastavaa varaa suuria muistilohkoja . Vaikka käytettävissä olevaa muistia on riittävästi, se voi epäilemättä aiheuttaa muistojen allokointivirheitä. Strategiat kuten muistojen yhdistäminen tai mukautettu muisto allokaattorit voivat auttaa vähentämään pirstoutumista.

Lopuksi rajat strdup()-funktio päätetään usein gadgetin tulevan muistin, dynaamisesti allokoitujen muistolohkojen pituuden ja mahdollisten toteutusta koskevien säännösten perusteella. Muistinvaraushäiriöiden käsittely ja turvallisuusnäkökohtien huomioon ottaminen käytettäessä strdup()-funktio merkkijonojen kopioiminen on kriittistä.