logo

funkcija strdup() v C

V tem članku boste spoznali funkcijo strdup() v C z njeno sintakso, primerom, kompleksnostjo, prednostmi in slabostmi.

The funkcijo strdup(). podvoji podani niz v programskem jeziku C. Sprejme niz z a nična odpoved kot argument. To izhodi kazalec na nov dinamično dodeljen niz, ki je dvojnik (tj. an natančna kopija ) vhodnega niza.

The funkcijo strdup(). ni del skupna knjižnica C . Vendar pa je pogosto na voljo kot komponenta pripomočkov za manipulacijo nizov na različnih platformah. Opredeljen je na naslednji način:

Sintaksa:

Ima naslednjo sintakso:

 char *strdup(const char *str); 

Motiv za funkcijo strdup(). je ustvariti a podvojena kopija danega niza. Potrebuje a ničelno zaključeno vrvica str kot svoj argument in vrne kazalec na popolnoma nov dinamično dodeljen niz, ki je prava replika pristnega niza.

ogrodje zbirk java

Tukaj je a razčlenitev po korakih kako strdup() običajno deluje:

  1. Funkcija izračuna dolžina vstopa niz str uporabljati funkcijo strlen(). . Dokonča se za določitev količine pomnilnika, potrebnega za shranjevanje podvojenega niza.
  2. Dodeljuje a nov pomnilniški blok ohraniti podvojeni niz uporabljati funkcijo malloc(). . Velikost pomnilniškega bloka se določi z vključitvijo 1 v dolžini vneseni niz . The dodatno 1 je za ničelni znak ('') ki zaključuje niz.
  3. Če je dodeljevanje pomnilnika je ni uspelo , the funkcijo strdup(). bo tudi pravilno vrnil a ničelni kazalec ( malloc() naredi enako). Preučevanje strdup() vrnjena vrednost funkcije je bistvena za obravnavo takih okoliščin.
  4. The končni rezultat funkcije je kazalec na nov dodeljen blok pomnilnika, ki vsebuje podvojeni niz.

Pri uporabi moramo opaziti naslednje težave funkcijo strdup(). :

The funkcijo strdup(). dinamično dodeljuje spomin za reprodukcijski niz. Zato je to programerjeva odgovornost za sprostitev tega pomnilnika, ko milje zdaj ne želijo uporabljati loose() značilnost . Če pomnilnika ne sprostite, lahko pride do uhajanja pomnilnika.

Običajno je dobra izbira, da se izognete uporabi funkcijo strdup(). na velikih nizih ali v situacijah, ko bo pri dodelitvi pomnilnika predmet . Odkar je funkcijo strdup(). dinamično dodeljuje pomnilnik, lahko odpove brez neustrezne reminiscence.

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

Izhod:

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

Pojasnilo:

Vključite bistvene naslovne dokumente:

    stdio.h se uporablja za vhodno/izhodne operacije . Niz.h se uporablja za funkcije manipulacije nizov. Stdlib.h se uporablja za dinamično dodeljevanje pomnilnika Lastnosti.

Določite spremenljivke:

  • Unique je kazalec na stalni niz 'Pozdravljen, svet!' . Ta niz je tisti, ki ga moramo posnemati.
  • The replika je kazalec na osebo. Shranil bo podvojeni niz, ustvarjen z strdup() .

Pokliči strdup():

  • The funkcijo strdup(). se imenuje, mimo izvirna vrvica kot prepir . Ustvarja a replika od izvirna vrvica in vrne kazalec na podvojeni niz. Ta kazalec je dodeljen podvojeni spremenljivki.

Preverite, ali dodelitev pomnilnika postane zadetek:

  • Program preveri, ali dvojnik ni a ničelni kazalec . če funkcijo strdup(). je bil zadetek pri dodeljevanju reminiscence za podvojeni niz, podvojenega zdaj ne bo nič .

Natisnite izvirne in podvojene nize:

  • Če je dodeljevanje pomnilnika spremeni a udarec , ta sistem natisne verodostojno in izvodov uporabo nizov izjave printf(). . The %s specifikator formata je navajen tiskanje nizov .

Prosti dinamično dodeljeni pomnilnik:

java xor
  • Po natisu nizov ta sistem pokliče brezplačno (dvojnik) za zagon dinamično dodeljen pomnilnik . Ta korak je ključnega pomena za preprečitev uhajanja spominov.

Obravnava napake pri dodelitvi pomnilnika:

  • Če dodelitev pomnilnika ni uspela (tj strdup() delovanje spodnjega dela hrbta a ničelni kazalec ), program natisne a sporočilo o napaki kar kaže, da dodelitev pomnilnika ni uspela.

Vrnitev iz glavne():

  • Program vrne 0 , ki nakazuje uspešna izvedba , na delujočo napravo.

Na splošno ta aplikacija prikazuje uporabo funkcijo strdup(). kopirati niz, testi za uspešno dodelitev reminiscence in odtisi verodostojne in kopirane nize. Obravnava tudi situacijo, ko dodelitev spomina ne uspe.

Analiza kompleksnosti:

The čas in kompleksnost prostora od funkcijo strdup(). se lahko analizira na naslednji način:

Časovna zapletenost:

  • The časovna kompleksnost od funkcijo strdup(). se lahko šteje za linearno oz O(n) , v katerem n je dolžina vnosni niz . To je posledica dejstva strdup() vključuje dve primarni operaciji:
  • Izračun trajanja vnesenega niza:The funkcija strlen(). se običajno uporablja za določanje dolžine vhodnega niza. Ponavlja znake niza, dokler ne naleti na ničelni posameznik ('') . Ta operacija traja O(n) časovna zapletenost , v katerem n je obdobje vrvica .Kopiranje niza:The kopiranje dosežen s pomočjo funkcijo strcpy(). ali funkcijo memcpy(). vzame O(n) časovna kompleksnost tako lepo. Vključuje ponavljanje vsakega posameznika vnesenega niza in njegovo kopiranje v novo dodeljeni reminiscenčni blok.
  • Zato se lahko celotna časovna kompleksnost strdup() približa kot O(n) , kje n je obdobje vnosni niz .

Kompleksnost prostora:

  • The kompleksnost prostora od funkcijo strdup(). je prav tako linearna oz O(n) , v katerem n je trajanje vnosni niz . To je zato, ker strdup() dinamično dodeli pomnilnik za reprodukcijski niz, kar zahteva dodatno območje za nakupovanje kopiranih znakov.
  • Količina dodeljenega pomnilnika se določi z uporabo lestvice vnesenega niza, n + 1 , kje n ali je dolžina od vnosni niz . Dodatek '+1' je za ničelni posameznik ('') . Priložen je k podvojeni nizi opustitev, da zagotovite, da so kilometri ničelno zaključeno .
  • Zato na splošno kompleksnost prostora od strdup() je O(n) , v katerem n je trajanje vnosni niz .

Omeniti velja, da je v realnem času in prostorske potrebe lahko prizadenejo dejavniki, stroški upravljanja pomnilnika, strojno specifične optimizacije in podrobnosti o izvajanju uporabe knjižnice C. te zapletenosti delujejo kot prednostna smernica za prepoznavanje splošnih značilnosti delovanja funkcijo strdup(). .

Značilnosti strdup() v C:

The funkcijo strdup(). v C ima naslednje značilnosti:

Podvajanje niza: Pomemben motiv za funkcijo strdup(). je ustvariti reprodukcijski dvojnik danega niza. Dodeli pomnilnik za podvojeni niz in kopira vsebino pristnega niza v novo dodeljen pomnilniški blok.

parameter v lupinskem skriptu

Dinamična dodelitev pomnilnika: The funkcijo strdup(). dinamično dodeli pomnilnik za podvojeni niz za uporabo značilnost malloc(). . Ta metoda, pri kateri se pomnilnik dodeli med izvajanjem in ga je mogoče zagnati z uporabo funkcija free(). medtem ko zdaj ni potreben.

Nična prekinitev: The podvojeni niz ustvaril funkcijo strdup(). je prav tako ničelno zaključeno , podobno kot verodostojna vrvica . The ničelni posameznik ('') je pripet na vrh reprodukcijskega niza, da označi prekinitev niza.

Vrnjen kazalec: The funkcijo strdup(). vrne kazalec na novo dodeljeni reminiscenčni blok, ki vsebuje podvojeni niz . Kazalec kaže na prvo osebo podvojenega niza.

Obravnava napak: Če dodelitev reminiscence ne uspe, se funkcijo strdup(). vrne a ničelni kazalec za označevanje neuspeha. Testiranje povratne vrednosti funkcijo strdup(). reševanje takšnih scenarijev in varčevanje pred dostopom do pomnilnika, ki ni bil uspešno dodeljen, je ključnega pomena.

Prenosljivost: Čeprav je funkcijo strdup(). ni vedno del običajne knjižnice C, običajno je na voljo v številnih sistemih kot del pripomočkov za manipulacijo nizov. Vendar se lahko njegova razpoložljivost razlikuje glede na posebno platformo oz prevajalnik .

Odgovornost za upravljanje pomnilnika: Pri uporabi funkcijo strdup(). , mora programer sprostiti dinamično dodeljeni pomnilnik za uporabo funkcija free(). takoj ko se ne želi. Če tega ne dosežete, lahko pride do uhajanja pomnilnika in program lahko z leti požre pretirano obujanje spominov.

Združljivost s standardnimi funkcijami nizov: The podvojeni niz vrnil funkcijo strdup(). se lahko uporablja z različnimi trendovskimi funkcijami nizov C, saj je daleč a ničelno končan niz . Omogoča za čisto integracijo s trenutno kodo, ki manipulira z nizi.

Prednosti strdup() v C:

Obstaja več prednosti funkcijo strdup(). v C. Nekatere glavne prednosti funkcije strdup() so naslednje:

Priročnost in enostavnost: The funkcijo strdup(). poenostavi postopek kopiranja niza z združitvijo dodeljevanje pomnilnika in kopiranje nizov metode v en sam klic funkcije. Kot rezultat, kompleksnost in berljivost kode sta oba zmanjšala , razvijalcem pa je prihranjeno pisanje edinstvene kode za izvajanje teh dejavnosti.

Berljivost kode in vzdržljivost: Uporabljati funkcijo strdup(). , koda postane bolj berljiva in samoumevna. Klic funkcije dejansko namerava podvojiti niz, kar izboljša berljivost kode. Prav tako zmanjša možnost uvajanja napak, povezanih z dodeljevanjem pomnilnika vodnika in kopiranjem nizov, kar povzroči dodatno kodo, ki jo je mogoče vzdrževati.

Ponovna uporabnost kode: The funkcijo strdup(). omogoča ustvarjanje dodatkov kode za večkratno uporabo. Z inkapsulacijo odlične presoje za podvajanje niza v ločeno funkcijo lahko brez truda znova uporabite funkcijo v več elementih vaše kodne baze. Spodbuja modularnost kode in zmanjšuje redundanco.

Prilagodljivost z dodeljevanjem pomnilnika: Odkar je funkcijo strdup(). dinamično dodeli pomnilnik za podvojeni niz, omogoča prilagodljivost pri upravljanju nizov različnih dolžin. Ni vam treba skrbeti za približno meje dimenzij medpomnilnikov s fiksno velikostjo. Še posebej je uporaben pri upravljanju vhodnih nizov neznanih ali spremenljivih dolžin.

Izogibanje prelivom medpomnilnika: Medpomnilnik se preliva se pojavijo, ko informacije presežejo dodeljeni spominski prostor, kar lahko povzroči varnostne ranljivosti in zrušitve aplikacij. Uporabljati funkcijo strdup(). , se lahko izognete težavam s prekoračitvijo medpomnilnika, ker funkcija redno dodeljuje pomnilnik v celoti glede na trajanje vnesenega niza.

Optimizacija pomnilnika: V nekaterih primerih z uporabo funkcijo strdup(). lahko povzroči optimizacijo pomnilnika. Na primer, ko več spremenljivk kaže na enako vsebino niza, se niz podvoji z strdup() lahko zmanjša uporabo pomnilnika z dodelitvijo ločenega pomnilnika za vsako spremenljivko namesto podvajanja celotne vsebine pomnilnika.

Omejitve/slabosti strdup() v C:

The funkcijo strdup(). v C nima posebnih omejitev, ki jih določa razširjen jezik C. Vendar osnovna naprava in razpoložljiva sredstva motivirajo njegovo vedenje in omejitve. Tukaj je nekaj vprašanj v zvezi z omejitvami pri uporabi funkcijo strdup(). :

Razpoložljiv pomnilnik: Omejitev številka ena za funkcijo strdup(). ali je razpoložljivost reminiscence v sistemu. Odkar je funkcijo strdup(). dinamično dodeli reminiscenco za reprodukcijski niz z uporabo malloc() , lahko količina reminiscence, ki je na voljo za dodelitev, omeji obseg niza, ki se lahko podvoji. Če ni dovolj pomnilnika za dodelitev podvojenega niza, bo funkcijo strdup(). ne bo uspel in vrnil a ničelni kazalec .

Največja dolžina niza: Največja doba niza, ki se lahko podvoji z funkcijo strdup(). se določi z lestvico reminiscenčnega bloka, ki ga je mogoče dodeliti. V največjih sistemih je največja velikost dinamično dodeljenega reminiscenčnega bloka motivirana z dejavniki, vključno z razpoložljivim fizičnim pomnilnikom in strukturo stroja. The podatkovni tip size_t , ki se uporablja za predstavitev lestvice reminiscenčnih blokov, lahko omeji največjo periodo niza.

Omejitve, specifične za izvedbo: The funkcijo strdup(). morda ima omejitve, specifične za izvedbo, naložene prek sistema ali uporabljene knjižnice C. Te omejitve se lahko razlikujejo med posameznimi sistemi in prevajalniki. Priporočljivo je, da se posvetujete z dokumentacijo ali sredstvi, edinstvenimi za platformo, da ugotovite morebitne posebne omejitve, ki jih nalaga implementacija.

Varnostni vidiki: Pri uporabi funkcijo strdup(). , je bistveno, da se zavedamo varnostnih tveganj zmogljivosti, vključno z prelivanje medpomnilnika ranljivosti. Odkar je funkcijo strdup(). dodeli reminiscenco glede na trajanje vnesenega niza; če je vneseni niz nezaupljiv ali neznanega obdobja, je ključnega pomena preveriti in sanirati vnos, da preprečite prelivanje medpomnilnika ali različne varnostne ranljivosti.

Večnitnost in sočasnost: Pri uporabi funkcijo strdup(). v večnitnem ali sočasnem okolju je ključnega pomena zagotoviti pravilno sinhronizacijo in varnost niti. Če poskuša več niti istočasno podvojiti nize, pogoji dirke in poškodba pomnilnika lahko nastane. Pravilni sinhronizacijski mehanizmi , kot naprimer ključavnice oz nitno varna dodelitev pomnilnika , je treba uporabiti za ublažitev teh težav.

markdown s slikami

Fragmentacija pomnilnika: Pogosta uporaba funkcijo strdup(). lahko prispeva k fragmentacija spomina čez čas. Razdrobljenost spomina se zgodi, ko se nepritrjen spomin razdeli na majhna , nesosednji bloki, zaradi česar je izziv dodeli velike pomnilniške bloke . Čeprav je razpoložljivega pomnilnika dovolj, lahko nedvomno povzroči napake pri dodeljevanju spominov. Strategije, kot so združevanje spominov oz reminiscenca po meri alokatorji lahko pomagajo pri ublažitvi razdrobljenosti.

Skratka, meje funkcijo strdup(). se pogosto odločajo na podlagi pomnilnika, ki ga je treba imeti v pripomočku, dolžine dinamično dodeljenih reminiscenčnih blokov in kakršnih koli izvedbenih natančnih predpisov. Ukvarjanje z napakami pri dodeljevanju pomnilnika in upoštevanje varnostnih vprašanj pri uporabi funkcijo strdup(). kopiranje nizov je kritično.