logo

strdup () funkcija C

Šiame straipsnyje sužinosite apie strdup() funkciją C su jos sintaksė, pavyzdžiu, sudėtingumu, pranašumais ir trūkumais.

The strdup() funkcija dubliuoja pateiktą eilutę C programavimo kalba. Jis priima eilutę su a nulinis nutraukimas kaip argumentas. Tai išėjimai žymeklis į naują dinamiškai priskirtą eilutę, kuri yra dublikatas (t. y. an tiksli kopija ) iš įvesties eilutės.

The strdup() funkcija nėra dalis bendra C biblioteka . Tačiau jis dažnai siūlomas kaip eilutės manipuliavimo paslaugų komponentas įvairiose platformose. Jis apibrėžiamas taip:

Sintaksė:

Ji turi tokią sintaksę:

 char *strdup(const char *str); 

Motyvas strdup() funkcija yra sukurti a dublikatas nurodytos eilutės. Tam reikia a nuliniu nutraukimu styga g kaip jo argumentas ir grąžina žymeklį į visiškai naują dinamiškai priskirtą eilutę, kuri yra an tikroji kopija autentiškos stygos.

java atvirkštinė eilutė

Štai a žingsnis po žingsnio suskirstymas kaip strdup () paprastai veikia:

  1. Funkcija apskaičiuoja ilgio įėjimo stygos g naudojant strlen() funkcija . Tai užbaigiama norint nuspręsti, kiek atminties reikia norint išsaugoti pasikartojančią eilutę.
  2. Jis skiria a naujas atminties blokas išlaikyti pasikartojanti eilutė naudojant malloc() funkcija . Atminties bloko dydis nustatomas įtraukiant 1 ilgio įvesta eilutė . The papildomas 1 yra skirtas nulinis simbolis ('') kuri užbaigia eilutę.
  3. Jei atminties paskirstymas yra nepavyko , strdup() funkcija taip pat teisingai grąžins a nulinis rodyklė ( malloc () daro tą patį). Nagrinėjant strdup () funkcijos grąžinimo vertė yra būtina sprendžiant tokias aplinkybes.
  4. The funkcijos galutinė išvestis yra žymeklis į naują paskirtą atminties bloką, kuriame yra pasikartojanti eilutė.

Naudodami turime pastebėti šias problemas strdup() funkcija :

The strdup() funkcija dinamiškai paskirsto atmintis reprodukcijai. Todėl tai yra programuotojo atsakomybė išlaisvinti šią atmintį, kai mylių dabar nenorėjo naudoti laisva() charakteristika . Nepavykus atlaisvinti atminties gali atsirasti atminties nutekėjimo.

Paprastai tai yra geras pasirinkimas vengti naudoti strdup() funkcija didelėse eilutėse arba situacijose, kai bus paskirstyta atmintis tema . Nuo pat strdup() funkcija dinamiškai paskirsto atmintį, ji gali sugesti be netinkamo prisiminimo.

Programa:

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

Išvestis:

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

Paaiškinimas:

Įtraukite pagrindinius antraštės dokumentus:

    stdio.h yra naudojamas įvesties/išvesties operacijas . Styga.h naudojamas styginių manipuliavimo funkcijoms atlikti. Stdlib.h yra naudojamas dinaminis atminties paskirstymas funkcijos.

Apibrėžkite kintamuosius:

  • Unikalus yra nuolatinės eilutės rodyklė 'Labas pasauli!' . Šią eilutę turime pakartoti.
  • The replika yra rodyklė į asmenį. Tai išsaugos pasikartojančią eilutę, sukurtą naudojant strdup () .

Skambinti strdup():

  • The strdup() funkcija yra vadinamas, pravažiuojant originali styga kaip an argumentas . Jis sukuria a replika apie originali styga ir grąžina žymeklį į pasikartojančią eilutę. Šis žymeklis priskiriamas pasikartojančiam kintamajam.

Patikrinkite, ar atminties paskirstymas nėra sėkmingas:

  • Programa patikrina, ar dublikatas nėra a nulinis rodyklė . Jeigu strdup() funkcija buvo įvykis skiriant pasikartojančios eilutės prisiminimus, dublikatas dabar nebus nulinis .

Spausdinti originalias ir pasikartojančias eilutes:

  • Jei atminties paskirstymas virsta a pataikyti , ši sistema spausdina autentiškas ir kopijų naudojant eilutes printf() teiginiai . The %s formato specifikacija turi įprotį spausdinti eilutes .

Laisva dinamiškai paskirstyta atmintis:

  • Išspausdinus eilutes, ši sistema iškviečia nemokama (dublikatas) paleisti dinamiškai paskirstyta atmintis . Šis žingsnis yra labai svarbus norint išvengti prisiminimų nutekėjimo.

Tvarkyti atminties paskirstymo gedimą:

  • Jei atminties paskirstymas nepavyko (t. y strdup () funkcija apatinėje nugaros dalyje a nulinis rodyklė ), programa išspausdina a nesėkmės pranešimas nurodant, kad atminties paskirstymas nepavyko.

Grįžti iš pagrindinio ():

katodinių spindulių vamzdžių monitorius
  • Programa grąžina 0 , nurodant sėkmingas vykdymas , prie darbo įrenginio.

Apskritai ši programa parodo, kaip naudojamas strdup() funkcija nukopijuoti eilutę, bandymai už sėkmingą prisiminimų paskirstymą ir spaudiniai autentiškos ir kopijuojamos eilutės. Ji taip pat tvarko situaciją, kai nepavyksta priskirti prisiminimų.

Sudėtingumo analizė:

The laikas ir erdvės sudėtingumas strdup() funkcija gali būti analizuojamas taip:

Laiko sudėtingumas:

  • The laiko sudėtingumas strdup() funkcija gali būti laikomas linijiniu arba O(n) , kuriame n yra ilgis įvesties eilutę . Taip yra dėl fakto strdup () apima dvi pagrindines operacijas:
  • Įvestos eilutės trukmės apskaičiavimas:The strlen() funkcija paprastai naudojamas nustatant įvesties eilutės ilgį. Jis kartoja eilutės simbolius, kol susiduria su niekinis asmuo ('') . Ši operacija trunka O(n) laiko sudėtingumas , kuriame n yra laikotarpis styga .Eilutės kopijavimas:The kopijavimo operacija pasiektas per strcpy() funkcija arba memcpy() funkcija paima O(n) laiko sudėtingumas kaip gražiai. Tai reiškia, kad reikia kartoti kiekvieną įvestos eilutės asmenį ir nukopijuoti ją į naujai priskirtą prisiminimų bloką.
  • Todėl bendras strdup() laiko sudėtingumas gali būti apytikslis kaip O(n) , kur n yra laikotarpis įvesties eilutę .

Erdvės sudėtingumas:

  • The erdvės sudėtingumas strdup() funkcija taip pat yra linijinis arba O(n) , kuriame n yra trukmė įvesties eilutę . Taip yra todėl strdup () dinamiškai paskirsto atmintį atkūrimo eilutei, todėl nukopijuotiems simboliams įsigyti reikia papildomos srities.
  • Skiriamos atminties kiekis nustatomas naudojant įvestos eilutės skalę, n + 1 , kur n yra ilgio įvesties eilutę . Papildomas '+1' yra skirtas niekinis asmuo ('') . Jis pridedamas prie pasikartojančios eilutės mesti, kad įsitikintų, jog tai mylios nuliniu nutraukimu .
  • Todėl bendras erdvės sudėtingumas iš strdup() yra O(n) , kuriame n yra trukmė įvesties eilutę .

Verta paminėti, kad realiu laiku ir vietos poreikį gali pakenkti veiksniai, atminties valdymo pridėtinės išlaidos, konkrečios mašinos optimizavimas , ir C bibliotekos naudojimo detales. Šie sudėtingumo veikia kaip pageidautina gairė, leidžianti atpažinti bendras veikimo charakteristikas strdup() funkcija .

Strdup() charakteristikos C:

The strdup() funkcija C turi šias charakteristikas:

Eilučių kopijavimas: Svarbus motyvas strdup() funkcija yra sukurti nurodytos eilutės atkūrimo dublikatą. Jis paskiria atmintį pasikartojančiai eilutei ir nukopijuoja autentiškos eilutės turinį į naujai priskirtą atminties bloką.

sql ddl komandas

Dinaminis atminties paskirstymas: The strdup() funkcija dinamiškai paskirsto atmintį pasikartojanti eilutė naudoti malloc() charakteristika . Šis metodas, kai atmintis paskirstoma vykdymo metu ir gali būti paleista naudojant nemokama () funkcija o dabar to nereikia.

Nulinis nutraukimas: The pasikartojanti eilutė sukūrė strdup() funkcija taip pat yra nuliniu nutraukimu , panašiai kaip autentiška styga . The niekinis asmuo ('') pridedamas prie atkūrimo eilutės viršaus, kad būtų pažymėta eilutės pabaiga.

Grąžintas rodyklė: The strdup() funkcija grąžina žymeklį į naujai priskirtą prisiminimų bloką, kuriame yra pasikartojanti eilutė . Rodyklė nurodo pirmąjį pasikartojančios eilutės asmenį.

Klaidų tvarkymas: Jei prisiminimų paskirstymas nepavyksta, strdup() funkcija grąžina a nulinis rodyklė reikšti nesėkmę. Grąžinamos vertės tikrinimas strdup() funkcija Norint išspręsti tokius scenarijus ir apsaugoti jus nuo prieigos prie nesėkmingai priskirtos atminties, labai svarbu.

Perkeliamumas: nors strdup() funkcija ne visada yra įprastos C bibliotekos dalis, ji paprastai pasiekiama daugelyje sistemų kaip eilutės manipuliavimo paslaugų dalis. Tačiau jo prieinamumas gali skirtis priklausomai nuo konkrečią platformą arba kompiliatorius .

Atsakomybė už atminties valdymą: Kai naudojate strdup() funkcija , programuotojas turi atjungti dinamiškai skirtą atmintį, kad galėtų naudoti free() funkcija kai tik to nenorima. Jei to nepasieksite, gali atsirasti atminties nutekėjimo, o programa gali suvalgyti pernelyg daug prisiminimų bėgant metams.

Suderinamumas su standartinėmis stygų funkcijomis: The pasikartojanti eilutė grąžino strdup() funkcija gali būti naudojamas su įvairiomis madingomis C stygų funkcijomis, nes tai toli gražu a nulinės pabaigos eilutė . Tai įleidžia švari integracija su esamu kodu, kuris manipuliuoja eilutėmis.

Strdup () pranašumai C:

Yra keletas privalumų strdup() funkcija C. Kai kurie pagrindiniai strdup() funkcijos pranašumai yra tokie:

Patogumas ir paprastumas: The strdup() funkcija supaprastina eilutės kopijavimo procesą sujungiant atminties paskirstymas ir eilutės kopijavimas metodus į vieną funkcijos iškvietimą. Dėl to, sudėtingumo ir skaitomumą kodo yra abu sumažėjo , o kūrėjai neturi rašyti unikalaus kodo, kad galėtų atlikti šią veiklą.

Kodo skaitomumas ir priežiūra: Naudojant strdup() funkcija , kodas tampa lengviau skaitomas ir aiškesnis. Funkcijos iškvietimas iš tikrųjų ketina kopijuoti eilutę, pagerindamas kodo skaitomumą. Tai taip pat sumažina klaidų, susijusių su vadovo atminties paskirstymu ir eilučių kopijavimu, atsiradimo galimybę, dėl ko atsiranda papildomas prižiūrimas kodas.

Kodo pakartotinis naudojimas: The strdup() funkcija leidžia sukurti daugkartinio naudojimo kodo priedus. Įtraukdami puikų sprendimą kopijuoti eilutę į atskirą funkciją, galite be vargo pakartotinai naudoti funkciją keliuose savo kodų bazės elementuose. Tai skatina kodo moduliškumą ir sumažina perteklių.

Atminties paskirstymo lankstumas: Nuo pat strdup() funkcija dinamiškai paskirsto atmintį pasikartojančiai eilutei, tai suteikia lankstumo tvarkant skirtingo ilgio eilutes. Jums nereikia jaudintis dėl fiksuoto dydžio buferių matmenų ribų. Tai ypač naudinga tvarkant nežinomo ar kintamo ilgio įvesties eilutes.

Buferio perpildymo išvengimas: Buferio perpildymas įvyksta, kai informacija viršija skirtą prisiminimų erdvę, o tai gali sukelti saugos spragas ir programos strigtis. Naudojant strdup() funkcija , galite išvengti buferio perpildymo problemų, nes funkcija reguliariai paskirsto atmintį visiškai pagal įvestos eilutės trukmę.

Atminties optimizavimas: Kai kuriais atvejais naudojant strdup() funkcija gali optimizuoti atmintį. Pavyzdžiui, kai keli kintamieji nurodo vienodą eilutės turinį, eilutė dubliuojama su strdup () gali sumažinti atminties naudojimą, skirdamas atskirą atmintį kiekvienam kintamajam, o ne dubliuodamas visą atminties turinį.

Strdup() apribojimai / trūkumai C:

The strdup() funkcija C kalba neturi konkrečių ribų, apibrėžtų plačiai paplitusioje C kalboje. Tačiau pagrindinis įrenginys ir turimas turtas skatina jo elgesį ir ribas. Štai keletas problemų, susijusių su apribojimais naudojant strdup() funkcija :

Galima atmintis: Apribojimas numeris vienas strdup() funkcija yra prieinamumas prisiminimų sistemoje. Nuo pat strdup() funkcija dinamiškai paskirsto prisiminimus atkūrimo eilutei naudojant malloc () , galimas paskirstyti prisiminimų kiekis gali apriboti eilutės, kuri gali būti dubliuojama, mastą. Jei trūksta atminties pasikartojančiai eilutei priskirti, strdup() funkcija nepavyks ir grįš a nulinis rodyklė .

Maksimalus stygos ilgis: Maksimalus eilutės laikotarpis, kurį galima kopijuoti su strdup() funkcija nustatomas per prisiminimų bloko, kurį galima skirti, mastelį. Maksimaliose sistemose maksimalų dinamiškai paskirstyto prisiminimų bloko dydį lemia veiksniai, įskaitant turimą fizinę atmintį ir įrenginio struktūrą. The size_t duomenų tipas , naudojamas vaizduoti prisiminimų blokų skalę, gali apriboti didžiausią eilučių laikotarpį.

Konkrečios įgyvendinimo ribos: The strdup() funkcija gali turėti konkrečių diegimo apribojimų, taikomų naudojant sistemą arba naudojamą C biblioteką. Šios ribos gali skirtis priklausomai nuo konkrečių sistemų ir kompiliatorių. Patartina susipažinti su dokumentacija arba platformos unikaliu turtu, kad būtų galima suprasti bet kokius konkrečius apribojimus, nustatytus įgyvendinant.

Saugumo svarstymai: Kai naudojate strdup() funkcija , labai svarbu žinoti apie pajėgumų saugumo riziką, įskaitant buferio perpildymas pažeidžiamumų. Nuo pat strdup() funkcija priskiria prisiminimus pagal įvestos eilutės trukmę, jei įvesta eilutė yra nepatikima arba nežinomo laikotarpio, labai svarbu patvirtinti ir išvalyti įvestį, kad būtų išvengta buferio perpildymo ar skirtingų saugos spragų.

Kelių gijų ir lygiagretumas: Kai naudojate strdup() funkcija kelių gijų arba lygiagrečioje aplinkoje labai svarbu užtikrinti tinkamą sinchronizavimą ir gijų saugumą. Jei kelios gijos bando dubliuoti eilutes vienu metu, lenktynių sąlygos ir atminties korupcija gali kilti. Tinkami sinchronizacijos mechanizmai , toks kaip spynos arba gijų saugus atminties paskirstymas , turi būti naudojami siekiant sumažinti šias bėdas.

Atminties fragmentacija: Dažnas naudojimas strdup() funkcija gali prisidėti atminties suskaidymas su laiku. Atminties fragmentacija atsitinka, kai neužsegta atmintis suskirstoma į mažas , negretimi blokai, daro tai iššūkį paskirstyti didelius atminties blokus . Nors turimos atminties pakanka, ji neabejotinai gali sukelti prisiminimų paskirstymo problemų. Tokios strategijos kaip prisiminimų telkimas arba užsakymą prisiminimai skirstytuvai gali padėti sumažinti susiskaidymą.

len of masyvo java

Apibendrinant, ribos strdup() funkcija dažnai nusprendžiama pagal turimą įtaiso atmintį, dinamiškai paskirstytų prisiminimų blokų ilgį ir bet kokias tikslias įgyvendinimo taisykles. Spręsti atminties paskirstymo problemas ir atsižvelgti į saugos problemas naudojant strdup() funkcija labai svarbu nukopijuoti eilutes.