logo

strdup() funktion i C

I denne artikel vil du lære om strdup()-funktionen i C med dens syntaks, eksempel, kompleksitet, fordele og ulemper.

Det strdup() funktion duplikerer en angivet streng i programmeringssproget C. Den accepterer en streng med en ugyldig opsigelse som et argument. Det udgange en pegepind til en ny dynamisk allokeret streng, der er en duplikat (dvs. en nøjagtig kopi ) af inputstrengen.

Det strdup() funktion er ikke en del af fælles C-bibliotek . Det tilbydes dog ofte som en komponent i strengmanipulationsværktøjerne på forskellige platforme. Det er defineret som følger:

Syntaks:

Den har følgende syntaks:

 char *strdup(const char *str); 

Motivet til strdup() funktion er at skabe en duplikatkopi af en given streng. Det tager en ugyldigt opsagt snor str som dens argumentation og returnerer en pointer til en helt ny dynamisk tildelt streng, der er en egentlig replika af den autentiske streng.

java indeholder understreng

Her er en trin-for-trin opdeling af hvordan strdup() fungerer typisk:

  1. Funktionen beregner længde af indgangen streng str bruger strlen() funktion . Det er afsluttet for at bestemme mængden af ​​hukommelse, der kræves for at gemme duplikatstrengen.
  2. Den tildeler en ny hukommelsesblok at beholde dublet streng bruger malloc() funktion . Størrelsen af ​​hukommelsesblokken bestemmes ved at inkludere 1 i længden af indtastet streng . Det ekstra 1 er for nultegn ('') der afslutter strengen.
  3. Hvis hukommelsestildeling er mislykkedes , det strdup() funktion vil også korrekt returnere en nul pointer ( malloc() gør det samme). Undersøgelse af strdup() funktion returværdi er afgørende for at håndtere sådanne omstændigheder.
  4. Det funktionens endelige output er en pegepind til den nye allokerede hukommelsesblok, der indeholder duplikatstrengen.

Vi skal bemærke følgende problemer, når vi bruger strdup() funktion :

Det strdup() funktion tildeler dynamisk hukommelse for reproduktionsstrengen. Derfor er det programmørens ansvar at frigive denne hukommelse, når det er miles nu ikke ønsket brugen af loose() karakteristik . Hvis hukommelsen ikke frigøres, kan det resultere i hukommelseslækager.

Det er almindeligvis et godt valg at undgå at bruge strdup() funktion på store strenge eller i situationer, hvor i hukommelsesallokering vil være emne . Siden strdup() funktion dynamisk allokerer hukommelsen, kan den fejle uden en utilstrækkelig reminiscens.

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

Produktion:

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

Forklaring:

Inkluder væsentlige overskriftsdokumenter:

    stdio.h bruges til input/output operationer . String.h bruges til strengmanipulationsfunktioner. Stdlib.h bruges til dynamisk hukommelsesallokering funktioner.

Definer variabler:

fejl: kunne ikke finde eller indlæse hovedklassen
  • Unik er en pegepind til en konstant streng 'Hej Verden!' . Denne streng er den, vi skal replikere.
  • Det replika er en pegepind til en person. Det gemmer den dubletstreng, der er oprettet med strdup() .

Kald strdup():

  • Det strdup() funktion kaldes, passerer original streng som en argument . Det skaber en replika af original streng og returnerer en markør til den duplikerede streng. Denne pointer er tildelt den duplikerede variabel.

Tjek, om hukommelsesallokering bliver et hit:

  • Programmet undersøger, om et duplikat ikke er en nul pointer . Hvis strdup() funktion var et hit ved tildelingen af ​​reminiscens til duplikatstrengen, vil en duplikat nu ikke blive nul .

Udskriv originale og duplikerede strenge:

  • Hvis hukommelsestildeling drejer a hit , udskriver dette system autentisk og kopier strenge ved hjælp af printf()-udsagn . Det %s formatspecifikation er vant til print strenge .

Gratis dynamisk allokeret hukommelse:

  • Efter udskrivning af strengene kalder dette system gratis (duplikat) at lancere dynamisk allokeret hukommelse . Dette trin er afgørende for at holde sig væk fra reminiscenslækager.

Håndter hukommelsesallokeringsfejl:

  • Hvis hukommelsestildelingen mislykkedes (dvs strdup() funktion lænden a nul pointer ), udskriver programmet en fejlmeddelelse hvilket indikerer, at hukommelsestildeling mislykkedes.

Retur fra hoved():

  • Programmet returnerer 0 , angiver vellykket udførelse , til den fungerende enhed.

Samlet set demonstrerer denne applikation brugen af strdup() funktion at kopiere en streng, tests for en vellykket erindringsfordeling, og udskrifter de autentiske og kopistrenge. Det håndterer også den situation, hvor tildeling af erindring mislykkes.

Kompleksitetsanalyse:

Det tid og rummets kompleksitet af strdup() funktion kan analyseres som følger:

Tidskompleksitet:

  • Det tidskompleksitet af strdup() funktion kan betragtes som lineær eller På) , hvori n er længden af input streng . Det skyldes det faktum strdup() indebærer to primære operationer:
  • Beregning af varigheden af ​​den indtastede streng:Det strlen() funktion bruges normalt til at bestemme længden af ​​inputstrengen. Den itererer over tegnene i strengen, indtil den støder på null individ ('') . Denne operation tager O(n) tidskompleksitet , hvori n er perioden for snor .Kopiering af strengen:Det kopieringsoperation opnået gennem strcpy() funktion eller den memcpy() funktion tager O(n) tidskompleksitet lige så pænt. Det indebærer, at hver enkelt person af den indtastede streng gentages og kopieres til den nyligt tildelte reminiscensblok.
  • Derfor kan den samlede tidskompleksitet af strdup() tilnærmes som På) , hvor n er perioden for input streng .

Rumkompleksitet:

  • Det rummets kompleksitet af strdup() funktion er ligeledes lineær eller På) , hvori n er varigheden af input streng . Det er fordi strdup() tildeler dynamisk hukommelse til reproduktionsstrengen, hvilket kræver et ekstra område til at shoppe de kopierede tegn.
  • Mængden af ​​tildelt hukommelse bestemmes ved at bruge skalaen for den indtastede streng, n + 1 , hvor n er længde af input streng . Det ekstra '+1' er for null individ ('') . Den er vedhæftet duplikerede strenge stoppe for at sikre, at det er miles ugyldigt opsagt .
  • Derfor er det overordnede rummets kompleksitet af strdup() er På) , hvori n er varigheden af input streng .

Det er værd at bemærke, at realtid og pladsbehov kan være ramt af faktorer, overhead til hukommelsesstyring, maskinspecifikke optimeringer , og implementeringsdetaljerne for C-biblioteket ved at blive brugt. Disse kompleksiteter fungere som en foretrukken retningslinje for at anerkende de overordnede præstationskarakteristika for strdup() funktion .

Karakteristika for strdup() i C:

Det strdup() funktion i C har følgende egenskaber:

Duplikering af strenge: Det vigtige motiv for strdup() funktion er at skabe et gengivelsesduplikat af en given streng. Den allokerer hukommelse til den duplikerede streng og kopierer indholdet af den autentiske streng til den nyligt allokerede hukommelsesblok.

hvordan man forvandler streng til int

Dynamisk hukommelsestildeling: Det strdup() funktion tildeler dynamisk hukommelse til dublet streng at bruge malloc() karakteristik . Denne metode, at hukommelsen tildeles ved kørsel og kan startes ved hjælp af free() funktion mens det nu ikke er nødvendigt.

Nul opsigelse: Det dublet streng skabt af strdup() funktion er ligeledes ugyldigt opsagt , meget ligesom autentisk streng . Det null individ ('') er tilføjet til toppen af ​​reproduktionsstrengen for at markere afslutningen af ​​strengen.

Returneret pointer: Det strdup() funktion returnerer en pointer til den nyligt tildelte reminiscensblok, der indeholder dublet streng . Markøren peger på det første individ af den duplikerede streng.

Fejlhåndtering: Hvis reminiscenstildelingen mislykkes, vil den strdup() funktion returnerer en nul pointer for at markere fiaskoen. Test af returværdien af strdup() funktion at løse sådanne scenarier og spare dig for at få adgang til hukommelse, der ikke er tildelt med succes, er afgørende.

Portabilitet: Selvom strdup() funktion er ikke altid en del af det sædvanlige C-bibliotek, det er normalt tilgængeligt på mange systemer som en del af strengmanipulationsværktøjerne. Dens tilgængelighed kan dog variere afhængigt af specifik platform eller compiler .

Ansvar for hukommelseshåndtering: Ved brug af strdup() funktion , skal programmøren frigøre den dynamisk tildelte hukommelse for at bruge free() funktion så snart det ikke er ønsket. Hvis dette ikke opnås, kan det føre til hukommelseslækager og kan formålet med programmet at fortære overdreven reminiscens gennem årene.

Kompatibilitet med standard strengfunktioner: Det dublet streng returneres af strdup() funktion kan bruges med forskellige trendy C-strengs funktioner, da det er langt en null-termineret streng . Det slipper ind for ren integration med nuværende kode, der manipulerer strenge.

Fordele ved strdup() i C:

Der er flere fordele ved strdup() funktion i C. Nogle hovedfordele ved strdup()-funktionen er som følger:

Bekvemmelighed og enkelhed: Det strdup() funktion strømliner processen med at kopiere en streng ved at flette hukommelsestildeling og streng kopiering metoder til et enkelt funktionskald. Som følge heraf kompleksitet og læsbarhed af koden er begge dele er faldet , og udviklere er skånet for at skrive unik kode til at udføre disse aktiviteter.

Kode læsbarhed og vedligeholdelse: Bruger strdup() funktion , bliver koden mere læsbar og selvforklarende. Funktionskaldet har faktisk til hensigt at duplikere en streng, hvilket forbedrer kodelæsbarheden. Det reducerer også muligheden for at introducere fejl forbundet med guidehukommelsesallokering og strengkopiering, hvilket resulterer i ekstra vedligeholdelsesvenlig kode.

Genanvendelighed af kode: Det strdup() funktion giver mulighed for at skabe genanvendelige kodeadditiver. Ved at indkapsle den fremragende dømmekraft til at kopiere en streng lige ind i en separat funktion, kan du ubesværet genbruge funktionen i flere elementer i din kodebase. Det fremmer kodemodularitet og reducerer redundans.

Fleksibilitet med hukommelsestildeling: Siden strdup() funktion tildeler dynamisk hukommelse til duplikatstrengen, det giver fleksibilitet i håndtering af strenge af forskellig længde. Du behøver ikke bekymre dig om dimensionsgrænserne for buffere med fast størrelse. Det er især nyttigt, når du administrerer inputstrenge af ukendte eller variable længder.

Undgå bufferoverløb: Buffer løber over opstår, når oplysningerne overstiger den tildelte erindringsplads, hvilket kan resultere i sikkerhedssårbarheder og programnedbrud. Bruger strdup() funktion , kan du undgå problemer med bufferoverløb, fordi funktionen rutinemæssigt allokerer hukommelse baseret på varigheden af ​​den indtastede streng.

Hukommelsesoptimering: I nogle tilfælde ved hjælp af strdup() funktion kan resultere i hukommelsesoptimering. For eksempel, når flere variabler peger på ens strengindhold, duplikeres strengen med strdup() kan reducere hukommelsesudnyttelsen ved at allokere separat hukommelse for hver variabel i stedet for at duplikere hele hukommelsesindholdet.

Grænser/ulemper ved strdup() i C:

Det strdup() funktion i C har ingen specifikke grænser defineret af C-sproget udbredt. Men den underliggende enhed og tilgængelige aktiver motiverer dens adfærd og grænser. Her er nogle spørgsmål vedrørende grænser, mens brugen af strdup() funktion :

Tilgængelig hukommelse: Nummer et begrænsning for strdup() funktion er tilgængelighed af erindring i systemet. Siden strdup() funktion tildeler dynamisk reminiscens til reproduktionsstrengen ved hjælp af malloc() , kan mængden af ​​reminiscens, der er tilgængelig for tildeling, begrænse skalaen af ​​den streng, der kan duplikeres. Hvis der er utilstrækkelig hukommelse til at allokere duplikatstrengen, strdup() funktion vil fejle og returnere en nul pointer .

Maksimal strenglængde: Den maksimale periode for en streng, der kan duplikeres med strdup() funktion bestemmes gennem skalaen af ​​den reminiscensblok, der kan tildeles. På maksimale systemer er den maksimale størrelse af en dynamisk allokeret reminiscensblok motiveret af faktorer, herunder den tilgængelige fysiske hukommelse og maskinens struktur. Det size_t datatype , der bruges til at repræsentere skalaen af ​​reminiscensblokke, kan pålægge en grænse for den mest strenge periode.

Implementeringsspecifikke grænser: Det strdup() funktion kan have implementeringsspecifikke grænser pålagt gennem systemet eller C-biblioteket, der bruges. Disse grænser kan variere mellem specifikke systemer og compilere. Det anbefales at konsultere dokumentationen eller platformens unikke aktiver for at forstå eventuelle særlige begrænsninger, der pålægges i forbindelse med implementeringen.

java tråd oprette

Sikkerhedsovervejelser: Ved brug af strdup() funktion , er det afgørende at være opmærksom på kapacitetssikkerhedsrisici, herunder bufferoverløb sårbarheder. Siden strdup() funktion allokerer reminiscens baseret på varigheden af ​​den indtastede streng, hvis den indtastede streng ikke er tillid til eller af en ukendt periode, er det afgørende at validere og rense inputtet for at forhindre bufferoverløb eller forskellige sikkerhedssårbarheder.

Multithreading og samtidighed: Ved brug af strdup() funktion i en flertråds- eller samtidige omgivelser er det afgørende at sikre korrekt synkronisering og trådsikkerhed. Hvis flere tråde forsøger at duplikere strenge samtidigt, race forhold og hukommelseskorruption kan opstå. Korrekte synkroniseringsmekanismer , såsom låse eller trådsikker hukommelsestildeling , skal bruges til at afbøde disse problemer.

Hukommelsesfragmentering: Hyppig brug af strdup() funktion kan bidrage til fragmentering af hukommelsen over tid. Hukommelsesfragmentering sker, når ulåst hukommelse bliver opdelt i lille , ikke-sammenhængende blokke, gør det udfordrende at tildele store hukommelsesblokke . Selvom den tilgængelige hukommelse er nok, kan den utvivlsomt forårsage forskruninger af reminiscensallokering. Strategier som erindringspulje eller tilpasset reminiscens allokatorer kan hjælpe med at afbøde fragmentering.

Afslutningsvis er grænserne for strdup() funktion afgøres ofte ved hjælp af den eksisterende hukommelse på gadget'en, længden af ​​dynamisk allokerede reminiscensblokke og eventuelle implementeringspræcise regler. Håndtering af hukommelsesallokering skru-ups og overvejer sikkerhedsproblemer, når du bruger strdup() funktion at kopiere strenge er afgørende.