logo

strdup() funkcija C

Šajā rakstā jūs uzzināsit par funkciju strdup() programmā C ar tās sintaksi, piemēru, sarežģītību, priekšrocībām un trūkumiem.

The strdup() funkcija dublē nodrošināto virkni C programmēšanas valodā. Tā pieņem virkni ar a nulles izbeigšana kā arguments. Tas izejas rādītājs uz jaunu dinamiski piešķirtu virkni, kas ir dublikāts (t.i., an precīza kopija ) no ievades virknes.

The strdup() funkcija nav daļa no kopējā C bibliotēka . Tomēr tas bieži tiek piedāvāts kā virkņu manipulācijas utilītu sastāvdaļa dažādās platformās. Tas ir definēts šādi:

Sintakse:

Tam ir šāda sintakse:

 char *strdup(const char *str); 

motīvs strdup() funkcija ir izveidot a dublikāta kopija no dotās virknes. Tas aizņem a nulles pārtraukta virkne str tā arguments un atgriež rādītāju uz pavisam jaunu dinamiski piešķirtu virkni, kas ir an faktiskā kopija no autentiskās virknes.

romiešu cipars no 1 līdz 100

Šeit ir a soli pa solim sadalījums par to, kā strdup () parasti darbojas:

  1. Funkcija aprēķina garums no ievades string str izmantojot strlen() funkcija . Tas ir pabeigts, lai izlemtu, cik daudz atmiņas ir nepieciešams, lai saglabātu virknes dublikātu.
  2. Tas piešķir a jauns atmiņas bloks lai saglabātu dublēt virkni izmantojot malloc() funkcija . Atmiņas bloka lielumu nosaka, iekļaujot 1 garumā ievadīta virkne . The papildus 1 ir paredzēts nulles rakstzīme ('') kas pārtrauc virkni.
  3. Ja atmiņas piešķiršana ir neizdevās , strdup() funkcija pareizi atgriezīs arī a nulles rādītājs ( malloc () dara to pašu). Pārbaudot strdup () funkcijas atgriešanas vērtība ir būtiska, lai risinātu šādus apstākļus.
  4. The funkcijas gala izvade ir rādītājs uz jauno piešķirto atmiņas bloku, kas satur virknes dublikātu.

Mums ir jāpamana šādas problēmas, lietojot strdup() funkcija :

The strdup() funkcija dinamiski piešķir atmiņa reprodukcijas virknei. Tāpēc tas ir programmētāja atbildība lai atbrīvotu šo atmiņu, kad tas ir jūdzes tagad nav vēlējies izmantot vaļīgs() raksturlielums . Ja atmiņa netiek atbrīvota, var rasties atmiņas noplūde.

Parasti tā ir laba izvēle izvairīties no strdup() funkcija uz lielām stīgām vai situācijās, kad tiks piešķirta atmiņa priekšmets . Kopš strdup() funkcija dinamiski piešķir atmiņu, tā var neizdoties bez neatbilstošas ​​atmiņas.

Programma:

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

Izvade:

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

Paskaidrojums:

Iekļaujiet galvenos galvenes dokumentus:

    stdio.h tiek izmantots ievades/izvades operācijas . String.h tiek izmantots virkņu manipulācijas funkcijām. Stdlib.h tiek izmantots dinamiska atmiņas piešķiršana Iespējas.

Definējiet mainīgos:

  • Unikāls ir rādītājs uz nemainīgu virkni 'Sveika pasaule!' . Šī virkne ir tā, kas mums ir jāatkārto.
  • The replika ir rādītājs uz personu. Tas saglabās dublikātu virkni, kas izveidota ar strdup () .

Zvanīt strdup():

  • The strdup() funkcija tiek saukts, ejot garām oriģinālā virkne kā an arguments . Tas rada a replika no oriģinālā virkne un atgriež rādītāju uz dublēto virkni. Šis rādītājs ir piešķirts dublētajam mainīgajam.

Pārbaudiet, vai atmiņas piešķiršana kļūst par trāpījumu:

  • Programma pārbauda, ​​vai dublikāts nav a nulles rādītājs . Ja strdup() funkcija bija trāpījums, piešķirot atgādinājumu dublikāta virknei, dublikāts tagad nebūs null .

Drukāt oriģinālās un dublētās virknes:

salīdzināms interfeiss java
  • Ja atmiņas piešķiršana pagriežas a sist , šī sistēma drukā autentisks un kopijas stīgas, izmantojot printf() paziņojumi . The %s formāta norādītājs ir pieradis drukas virknes .

Bezmaksas dinamiski piešķirtā atmiņa:

  • Pēc virkņu drukāšanas šī sistēma izsauc bezmaksas (dublikāts) lai palaistu dinamiski piešķirtā atmiņa . Šis solis ir ļoti svarīgs, lai izvairītos no atmiņu noplūdēm.

Rīkojieties ar atmiņas piešķiršanas kļūmi:

  • Ja atmiņas piešķiršana neizdevās (t.i., strdup () funkcija muguras lejasdaļa a nulles rādītājs ), programma izdrukā a neveiksmes ziņojums norādot, ka atmiņas piešķiršana neizdevās.

Atgriezties no galvenā():

  • Programma atgriež 0 , norādot veiksmīga izpilde , uz darba ierīci.

Kopumā šī lietojumprogramma parāda, kā tiek izmantots strdup() funkcija lai kopētu virkni, testiem par veiksmīgu atmiņu piešķiršanu, un izdrukas autentiskās un kopētās virknes. Tas arī risina situāciju, kad atgādinājumu piešķiršana neizdodas.

Sarežģītības analīze:

The laiks un telpas sarežģītība no strdup() līdzeklis var analizēt šādi:

Laika sarežģītība:

  • The laika sarežģītība no strdup() funkcija var uzskatīt par lineāru vai O(n) , kurā n ir garums ievades virkne . Tas ir saistīts ar faktu strdup () ietver divas galvenās darbības:
  • Ievadītās virknes ilguma aprēķināšana:The strlen() funkcija parasti izmanto, lai noteiktu ievades virknes garumu. Tas atkārto virknes rakstzīmes, līdz saskaras ar nulles indivīds ('') . Šī operācija aizņem O(n) laika sarežģītība , kurā n ir periods virkne .Virknes kopēšana:The kopēšanas operācija sasniegts, izmantojot strcpy() funkcija vai memcpy() funkcija ņem O(n) laika sarežģītība tikpat jauki. Tas ietver katra ievadītās virknes atkārtošanu un tā kopēšanu uz tikko piešķirto atmiņu bloku.
  • Tāpēc strdup () kopējo laika sarežģītību var tuvināt kā O(n) , kur n ir periods ievades virkne .

Kosmosa sarežģītība:

  • The telpas sarežģītība no strdup() funkcija tāpat ir lineārs vai O(n) , kurā n ir ilgums ievades virkne . Tas ir tāpēc strdup () dinamiski piešķir atmiņu reproducēšanas virknei, pieprasot papildu apgabalu, lai iepirktos nokopētās rakstzīmes.
  • Atvēlētās atmiņas apjoms tiek noteikts, izmantojot ievadītās virknes mērogu, n+1 , kur n ir garums no ievades virkne . Papildu '+1' ir paredzēts nulles indivīds ('') . Tas ir pievienots virknes dublikātus atmest, lai pārliecinātos, ka tā ir jūdzes nulles pārtraukta .
  • Tāpēc kopumā telpas sarežģītība no strdup() ir O(n) , kurā n ir ilgums ievades virkne .

Ir vērts atzīmēt, ka īsts laiks un telpas vajadzības var ietekmēt faktori, atmiņas pārvaldības pieskaitāmās izmaksas, mašīnai raksturīgas optimizācijas , un C bibliotēkas ieviešanas informācija. Šie sarežģītības darbojas kā ieteicamā vadlīnija, lai atpazītu vispārējos veiktspējas raksturlielumus strdup() funkcija .

Strdup() raksturlielumi C valodā:

The strdup() funkcija C ir šādas īpašības:

Virknes dublēšana: Svarīgs motīvs strdup() funkcija ir izveidot dotās virknes reprodukcijas dublikātu. Tā piešķir atmiņu dublētajai virknei un kopē autentiskās virknes saturu tikko piešķirtajā atmiņas blokā.

Oracle sql nav vienāds

Dinamiskā atmiņas piešķiršana: The strdup() funkcija dinamiski piešķir atmiņu dublēt virkni lai izmantotu malloc() īpašība . Šī metode, ka atmiņa tiek piešķirta izpildlaikā, un to var palaist, izmantojot bezmaksas () funkcija kamēr tas tagad nav vajadzīgs.

Nulle izbeigšana: The dublēt virkni izveidoja strdup() funkcija ir tāpat nulles pārtraukta , līdzīgi kā autentiska virkne . The nulles indivīds ('') ir pievienots reproducēšanas virknes augšpusē, lai atzīmētu virknes beigas.

Atgrieztais rādītājs: The strdup() funkcija atgriež rādītāju uz tikko piešķirto atmiņu bloku, kurā ir dublēt virkni . Rādītājs norāda uz dublikāta virknes pirmo personu.

Kļūdu apstrāde: Ja atgādinājumu piešķiršana neizdodas, strdup() funkcija atgriežas a nulles rādītājs lai apzīmētu neveiksmi. Atgriešanās vērtības pārbaude strdup() funkcija ir ļoti svarīgi risināt šādus scenārijus un glābt jūs no piekļuves atmiņai, kas nav sekmīgi piešķirta.

Pārnesamība: Lai gan strdup() funkcija ne vienmēr ir daļa no parastās C bibliotēkas, tā parasti ir pieejama daudzās sistēmās kā daļa no virkņu manipulācijas utilītprogrammām. Tomēr tā pieejamība var atšķirties atkarībā no konkrēta platforma vai kompilators .

Atbildība par atmiņas pārvaldību: Lietojot strdup() funkcija , programmētājam ir jāatvieno dinamiski piešķirtā atmiņa, lai izmantotu bezmaksas () funkcija tiklīdz to negrib. Ja to neizdosies sasniegt, var rasties atmiņas noplūde un programmas mērķis var tikt izmantots pārmērīgi daudzu atmiņu stāsti gadu gaitā.

Saderība ar standarta virknes funkcijām: The dublēt virkni atdeva strdup() funkcija var izmantot ar dažādām modernām C virknes funkcijām, jo ​​tas ir tālu a nulles beigu virkne . Tas ļauj iekšā tīra integrācija ar pašreizējo kodu, kas manipulē ar virknēm.

Strdup() priekšrocības valodā C:

Ir vairākas priekšrocības strdup() funkcija C. Dažas galvenās funkcijas strdup() priekšrocības ir šādas:

Ērtības un vienkāršība: The strdup() funkcija racionalizē virknes kopēšanas procesu, apvienojot atmiņas piešķiršana un virknes kopēšana metodes vienā funkcijas izsaukumā. Tā rezultātā, sarežģītība un lasāmība no koda ir abi samazinājies , un izstrādātāji tiek pasargāti no unikāla koda rakstīšanas, lai veiktu šīs darbības.

Koda lasāmība un uzturēšana: Izmantojot strdup() funkcija , kods kļūst lasāmāks un pašsaprotamāks. Funkciju izsaukums patiešām paredz dublēt virkni, uzlabojot koda lasāmību. Tas arī samazina iespēju ieviest kļūdas, kas saistītas ar ceļveža atmiņas piešķiršanu un virkņu kopēšanu, kā rezultātā tiek iegūts papildu uzturējams kods.

Koda atkārtota izmantošana: The strdup() funkcija ļauj izveidot atkārtoti lietojamas koda piedevas. Iekapsulējot lieliskos lēmumus par virknes dublēšanu atsevišķā līdzeklī, varat bez piepūles atkārtoti izmantot funkciju vairākos kodu bāzes elementos. Tas veicina koda modularitāti un samazina dublēšanos.

Elastība ar atmiņas piešķiršanu: Kopš strdup() funkcija dinamiski piešķir atmiņu dublētajai virknei, tā nodrošina elastību dažāda garuma virkņu pārvaldībā. Jums nav jāuztraucas par aptuveni fiksēta izmēra buferu izmēru robežām. Tas ir īpaši noderīgi, pārvaldot nezināma vai mainīga garuma ievades virknes.

Izvairīšanās no bufera pārpildes: Bufera pārpilde rodas, ja informācija pārsniedz piešķirto atmiņu vietu, kā rezultātā var rasties drošības ievainojamības un lietojumprogrammu avārijas. Izmantojot strdup() funkcija , varat izvairīties no bufera pārpildes problēmām, jo ​​funkcija regulāri piešķir atmiņu, pilnībā pamatojoties uz ievadītās virknes ilgumu.

Atmiņas optimizācija: Dažos gadījumos, izmantojot strdup() funkcija var izraisīt atmiņas optimizāciju. Piemēram, ja vairāki mainīgie norāda uz vienādu virknes saturu, virkne tiek dublēta ar strdup () var samazināt atmiņas izmantošanu, piešķirot atsevišķu atmiņu katram mainīgajam, nevis dublējot visu atmiņas saturu.

slēdža metode java

Strdup() ierobežojumi/trūkumi valodā C:

The strdup() funkcija C valodā nav īpašu ierobežojumu, ko nosaka plaši izplatītā C valoda. Tomēr pamatā esošā ierīce un pieejamie līdzekļi motivē tās uzvedību un ierobežojumus. Šeit ir daži jautājumi, kas attiecas uz ierobežojumiem, lietojot strdup() funkcija :

Pieejamā atmiņa: Ierobežojums numur viens strdup() funkcija ir pieejamība atmiņām sistēmā. Kopš strdup() funkcija dinamiski piešķir atgādinājumu reproducēšanas virknei, izmantojot malloc () , piešķiršanai pieejamais atgādinājumu daudzums var ierobežot tās virknes mērogu, kas var tikt dublēta. Ja nav pietiekami daudz atmiņas, lai piešķirtu virknes dublikātu, strdup() funkcija neizdosies un atgriezīsies a nulles rādītājs .

Maksimālais virknes garums: Virknes maksimālais periods, ko var dublēt ar strdup() funkcija tiek noteikts, izmantojot atmiņu bloka skalu, ko var piešķirt. Maksimālajās sistēmās dinamiski piešķirtā atmiņu bloka maksimālo izmēru nosaka faktori, tostarp pieejamā fiziskā atmiņa un iekārtas struktūra. The size_t datu tips , ko izmanto, lai attēlotu atmiņu bloku skalu, var noteikt ierobežojumu virknes periodam.

Ieviešanai specifiskie ierobežojumi: The strdup() līdzeklis sistēmā vai izmantotajā C bibliotēkā var būt noteikti ieviešanas ierobežojumi. Šie ierobežojumi var atšķirties atkarībā no konkrētām sistēmām un kompilatoriem. Ir ieteicams iepazīties ar dokumentāciju vai platformas unikālajiem līdzekļiem, lai saprastu jebkādus konkrētus ieviešanas ierobežojumus.

Drošības apsvērumi: Lietojot strdup() funkcija , ir ļoti svarīgi apzināties spēju drošības riskus, tostarp bufera pārplūde ievainojamības. Kopš strdup() funkcija piešķir atgādinājumu, pamatojoties uz ievadītās virknes ilgumu; ja ievadītā virkne ir neuzticama vai nezināma perioda, ir ļoti svarīgi apstiprināt un sanitizēt ievadi, lai novērstu bufera pārpildes vai dažādas drošības ievainojamības.

Daudzpavedienu veidošana un vienlaicīgums: Lietojot strdup() funkcija daudzpavedienu vai vienlaicīgā vidē ir ļoti svarīgi nodrošināt pareizu sinhronizāciju un pavedienu drošību. Ja vairāki pavedieni mēģina dublēt virknes vienlaikus, sacensību apstākļi un atmiņas korupcija var rasties. Pareizi sinhronizācijas mehānismi , piemēram, slēdzenes vai pavedienu droša atmiņas piešķiršana , ir jāizmanto, lai mazinātu šīs nepatikšanas.

Atmiņas fragmentācija: Bieža izmantošana strdup() funkcija var veicināt atmiņas fragmentācija laika gaitā. Atmiņas sadrumstalotība notiek, kad nepiesprādzētā atmiņa tiek sadalīta mazs , nesaistīti bloki, padarot to par izaicinājumu piešķirt lielus atmiņas blokus . Lai gan pieejamās atmiņas ir pietiekami, tas neapšaubāmi var izraisīt atgādinājumu piešķiršanas traucējumus. Stratēģijas, piemēram atmiņu apvienošana vai pielāgota atmiņa sadalītāji var palīdzēt mazināt sadrumstalotību.

Noslēgumā jāsaka, ka robežas strdup() funkcija bieži tiek izlemti, pamatojoties uz sīkrīka paredzēto atmiņu, dinamiski piešķirto atmiņu bloku garumu un jebkuriem precīziem ieviešanas noteikumiem. Atmiņas piešķiršanas problēmu risināšana un drošības apsvērumu ievērošana, lietojot strdup() funkcija virkņu kopēšana ir ļoti svarīga.