logo

strdup()-funksjonen i C

I denne artikkelen vil du lære om strdup()-funksjonen i C med dens syntaks, eksempel, kompleksitet, fordeler og ulemper.

De strdup() funksjon dupliserer en gitt streng i programmeringsspråket C. Den aksepterer en streng med en null oppsigelse som et argument. Den utganger en peker til en ny dynamisk allokert streng som er en duplikat (dvs. en eksakt kopi ) av inndatastrengen.

De strdup() funksjon er ikke en del av felles C-bibliotek . Imidlertid tilbys det ofte som en komponent av strengmanipulasjonsverktøyene på forskjellige plattformer. Det er definert som følger:

Syntaks:

Den har følgende syntaks:

 char *strdup(const char *str); 

Motivet til strdup() funksjon er å lage en duplikatkopi av en gitt streng. Det tar en null avsluttet streng str som argumentet sitt og returnerer en peker til en helt ny dynamisk tildelt streng som er en faktisk kopi av den autentiske strengen.

java inneholder delstreng

Her er en trinnvis oppdeling av hvordan strdup() fungerer vanligvis:

  1. Funksjonen beregner lengde av inn streng str bruker strlen() funksjon . Den er fullført for å bestemme mengden minne som kreves for å lagre den dupliserte strengen.
  2. Den tildeler en ny minneblokk å beholde duplikatstreng bruker malloc() funksjon . Størrelsen på minneblokken bestemmes ved å inkludere 1 i lengden av angitt streng . De ekstra 1 er for nulltegn ('') som avslutter strengen.
  3. Hvis minnetildeling er mislyktes , den strdup() funksjon vil også riktig returnere en null-peker ( malloc() gjør det samme). Undersøker strdup() funksjonsreturverdi er avgjørende for å håndtere slike omstendigheter.
  4. De funksjonens endelige utgang er en peker til den nye tildelte minneblokken som inneholder duplikatstrengen.

Vi må legge merke til følgende problemer når vi bruker strdup() funksjon :

De strdup() funksjon tildeler dynamisk hukommelse for reproduksjonsstrengen. Derfor er det programmerers ansvar å frigjøre dette minnet når det er miles nå ikke ønsket bruken av loose() karakteristikk . Unnlatelse av å frigjøre minnet kan føre til minnelekkasjer.

Det er vanligvis et godt valg å unngå å bruke strdup() funksjon på store strenger eller i situasjoner der minnetildeling vil være Emne . Siden strdup() funksjon dynamisk tildeler minne, kan det mislykkes uten en utilstrekkelig erindring.

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

Produksjon:

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

Forklaring:

Inkluder viktige overskriftsdokumenter:

    stio.h brukes til input/output operasjoner . String.h brukes til strengmanipulasjonsfunksjoner. Stdlib.h brukes til dynamisk minnetildeling egenskaper.

Definer variabler:

feil: kunne ikke finne eller laste inn hovedklassen
  • Unik er en peker til en konstant streng 'Hei Verden!' . Denne strengen er den vi trenger for å replikere.
  • De replika er en pekepinn til en person. Det vil lagre duplikatstrengen opprettet med strdup() .

Ring strdup():

  • De strdup() funksjon kalles, passerer original streng som en argument . Det skaper en replika av original streng og returnerer en peker til den dupliserte strengen. Denne pekeren er tilordnet duplikatvariabelen.

Sjekk om minnetildeling blir et treff:

  • Programmet undersøker om et duplikat ikke er en null-peker . Hvis strdup() funksjon var en hit i tildelingen av erindring for duplikatstrengen, vil et duplikat nå ikke bli null .

Skriv ut originale og dupliserte strenger:

  • Hvis minnetildeling blir a truffet , skriver dette systemet ut autentisk og kopier strenger ved hjelp av printf()-setninger . De %s formatspesifikasjoner er vant til skrive ut strenger .

Ledig dynamisk tildelt minne:

  • Etter å ha skrevet ut strengene, ringer dette systemet gratis (duplikat) å lansere dynamisk tildelt minne . Dette trinnet er avgjørende for å unngå minnelekkasjer.

Håndter minnetildelingsfeil:

  • Hvis minnetildelingen mislyktes (dvs strdup() funksjon korsryggen a null-peker ), skriver programmet ut en feilmelding som indikerer at minnetildeling mislyktes.

Retur fra hoved():

  • Programmet returnerer 0 , som indikerer vellykket utførelse , til den fungerende enheten.

Totalt sett demonstrerer denne applikasjonen bruken av strdup() funksjon å kopiere en streng, tester for en vellykket erindringstildeling, og utskrifter de autentiske og kopistrengene. Den håndterer også situasjonen der tildeling av erindring mislykkes.

Kompleksitetsanalyse:

De tid og plass kompleksitet av strdup() funksjon kan analyseres som følger:

Tidskompleksitet:

  • De tidskompleksitet av strdup() funksjon kan betraktes som lineær eller På) , hvori n er lengden på inndatastreng . Det er på grunn av faktum strdup() innebærer to primære operasjoner:
  • Beregner varigheten av den angitte strengen:De strlen() funksjon brukes vanligvis til å bestemme lengden på inndatastrengen. Den itererer over tegnene i strengen til den møter null individ ('') . Denne operasjonen tar O(n) tidskompleksitet , hvori n er perioden for streng .Kopierer strengen:De kopieringsoperasjon oppnådd gjennom strcpy() funksjon eller memcpy() funksjon tar O(n) tidskompleksitet like fint. Det innebærer å iterere over hvert individ av den angitte strengen og kopiere den til den nylig tildelte reminissensblokken.
  • Derfor kan den totale tidskompleksiteten til strdup() tilnærmes som På) , hvor n er perioden for inndatastreng .

Plass kompleksitet:

  • De plass kompleksitet av strdup() funksjon er likeledes lineær eller På) , hvori n er varigheten av inndatastreng . Det er fordi strdup() tildeler dynamisk minne for reproduksjonsstrengen, og krever et ekstra område for å handle de kopierte tegnene.
  • Mengden minne som er tildelt bestemmes ved å bruke skalaen til den angitte strengen, n + 1 , hvor n er den lengde av inndatastreng . Det ekstra '+1' er for null individ ('') . Den er vedlagt dupliserte strenger slutte for å sikre at det er miles null avsluttet .
  • Derfor den samlede plass kompleksitet av strdup() er På) , hvori n er varigheten av inndatastreng .

Det er verdt å merke seg at sanntid og plassbehov kan bli rammet av faktorer, minneadministrasjon overhead, maskinspesifikke optimaliseringer , og implementeringsdetaljene til C-biblioteket som blir brukt. Disse kompleksitet fungere som en foretrukket retningslinje for å gjenkjenne de generelle ytelsesegenskapene til strdup() funksjon .

Karakteristikk av strdup() i C:

De strdup() funksjon i C har følgende egenskaper:

Duplisering av strenger: Det viktige motivet til strdup() funksjon er å lage et reproduksjonsduplikat av en gitt streng. Den tildeler minne for den dupliserte strengen og kopierer innholdet i den autentiske strengen inn i den nylig tildelte minneblokken.

diskret matematikk negasjon

Dynamisk minnetildeling: De strdup() funksjon tildeler dynamisk minne for duplikatstreng å bruke malloc() karakteristikk . Denne metoden som minnet tildeles ved kjøretid og kan startes ved hjelp av free() funksjon mens det nå ikke er nødvendig.

Null oppsigelse: De duplikatstreng opprettet av strdup() funksjon er likeledes null avsluttet , omtrent som autentisk streng . De null individ ('') er lagt til toppen av reproduksjonsstrengen for å markere avslutningen av strengen.

Returnert peker: De strdup() funksjon returnerer en peker til den nylig tildelte reminissensblokken som inneholder duplikatstreng . Pekeren peker på den første personen i den dupliserte strengen.

Feilhåndtering: Hvis erindringstildelingen mislykkes, vil strdup() funksjon returnerer en null-peker for å markere fiaskoen. Tester returverdien til strdup() funksjon Det er avgjørende å løse slike scenarier og spare deg for å få tilgang til minnet som ikke er tildelt.

Portabilitet: Selv om strdup() funksjon er ikke alltid en del av det vanlige C-biblioteket, det er vanligvis tilgjengelig på mange systemer som en del av strengmanipulasjonsverktøyene. Tilgjengeligheten kan imidlertid variere avhengig av spesifikk plattform eller kompilator .

Ansvar for minnehåndtering: Når du bruker strdup() funksjon , må programmereren løsne det dynamisk tildelte minnet for å bruke free() funksjon så snart det ikke er ønsket. Å unnlate å oppnå dette kan føre til minnelekkasjer og kan hensikten med programmet til å sluke overdreven erindring gjennom årene.

Kompatibilitet med standard strengfunksjoner: De duplikatstreng returnert av strdup() funksjon kan brukes med forskjellige trendy C-strengfunksjoner, da det er langt en null-terminert streng . Det slipper inn for ren integrasjon med nåværende kode som manipulerer strenger.

Fordeler med strdup() i C:

Det er flere fordeler med strdup() funksjon i C. Noen hovedfordeler med strdup()-funksjonen er som følger:

Bekvemmelighet og enkelhet: De strdup() funksjon effektiviserer prosessen med å kopiere en streng ved å slå sammen minnetildeling og streng kopiering metoder til et enkelt funksjonskall. Som et resultat har kompleksitet og lesbarhet av koden er begge deler redusert , og utviklere slipper å skrive unik kode for å utføre disse aktivitetene.

Kodelesbarhet og vedlikehold: Bruker strdup() funksjon , blir koden mer lesbar og selvforklarende. Funksjonskallet har faktisk til hensikt å duplisere en streng, noe som forbedrer kodelesbarheten. Det reduserer også muligheten for å introdusere feil knyttet til tildeling av guideminne og strengkopiering, noe som resulterer i ekstra vedlikeholdbar kode.

Gjenbrukbarhet av kode: De strdup() funksjon gjør det mulig å lage gjenbrukbare kodetilsetningsstoffer. Ved å kapsle inn den utmerkede vurderingen for å duplisere en streng rett inn i en egen funksjon, kan du enkelt gjenbruke funksjonen i flere elementer i kodebasen din. Det fremmer kodemodularitet og reduserer redundans.

Fleksibilitet med minnetildeling: Siden strdup() funksjon tildeler dynamisk minne for den dupliserte strengen, og gir fleksibilitet i håndtering av strenger av forskjellig lengde. Du trenger ikke å bekymre deg om dimensjonsgrensene til buffere med fast størrelse. Det er spesielt nyttig når du administrerer inndatastrenger med ukjente eller variable lengder.

Unngå bufferoverløp: Buffer renner over oppstår når informasjon overskrider den tildelte minneplassen, noe som kan føre til sikkerhetssårbarheter og programkrasj. Bruker strdup() funksjon , kan du unngå bufferoverløpsproblemer fordi funksjonen rutinemessig tildeler minne basert helt på varigheten av den angitte strengen.

Minneoptimalisering: I noen tilfeller bruker du strdup() funksjon kan resultere i minneoptimalisering. For eksempel, når flere variabler peker på likt strenginnhold, dupliseres strengen med strdup() kan redusere minneutnyttelsen ved å tildele separat minne for hver variabel i stedet for å duplisere hele minneinnholdet.

Begrensninger/ulemper av strdup() i C:

De strdup() funksjon i C har ingen spesifikke grenser definert av C-språket som er utbredt. Imidlertid motiverer den underliggende enheten og tilgjengelige eiendeler dens oppførsel og grenser. Her er noen spørsmål angående grenser mens bruken av strdup() funksjon :

Tilgjengelig minne: Begrensningen nummer én for strdup() funksjon er den tilgjengelighet av erindring i systemet. Siden strdup() funksjon tildeler dynamisk reminiscens for reproduksjonsstrengen ved hjelp av malloc() , kan mengden av erindring som er tilgjengelig for tildeling begrense omfanget av strengen som kan dupliseres. Hvis det er utilstrekkelig minne til å tildele den dupliserte strengen, strdup() funksjon vil mislykkes og returnere en null-peker .

Maksimal strenglengde: Den maksimale perioden for en streng som kan dupliseres med strdup() funksjon bestemmes gjennom skalaen til reminissensblokken som kan tildeles. På maksimale systemer er den maksimale størrelsen på en dynamisk allokert reminiscensblokk motivert av faktorer inkludert tilgjengelig fysisk minne og maskinens struktur. De size_t datatype , som brukes til å representere skalaen til reminiscensblokker, kan pålegge en grense for perioden med flest strenger.

Implementeringsspesifikke grenser: De strdup() funksjon kan ha implementeringsspesifikke grenser pålagt gjennom systemet eller C-biblioteket som brukes. Disse grensene kan variere mellom spesifikke systemer og kompilatorer. Det anbefales å konsultere dokumentasjonen eller plattformunike eiendeler for å forstå eventuelle spesielle begrensninger som er pålagt gjennom implementeringen.

python slange vs anaconda

Sikkerhetshensyn: Når du bruker strdup() funksjon , er det viktig å være klar over kapasitetssikkerhetsrisikoer, inkludert bufferoverløp sårbarheter. Siden strdup() funksjon tildeler erindring basert på varigheten av den angitte strengen, hvis den angitte strengen er uklarert eller av en ukjent periode, er det avgjørende å validere og rense inndataene for å forhindre bufferoverløp eller andre sikkerhetssårbarheter.

Multithreading og samtidighet: Når du bruker strdup() funksjon i flertrådede eller samtidige omgivelser er det avgjørende å sikre riktig synkronisering og trådsikkerhet. Hvis flere tråder prøver å duplisere strenger samtidig, løpsforholdene og minnekorrupsjon kan oppstå. Riktige synkroniseringsmekanismer , som for eksempel låser eller trådsikker minnetildeling , må brukes for å dempe disse problemene.

Minnefragmentering: Hyppig bruk av strdup() funksjon kan bidra til minnefragmentering over tid. Minnefragmentering skjer når ufestet minne blir delt inn i liten , ikke-sammenhengende blokker, gjør det utfordrende å tildele store minneblokker . Selv om det tilgjengelige minnet er nok, kan det utvilsomt føre til at minnetildelingen skrus opp. Strategier som samling av erindring eller tilpasset erindring tildelere kan hjelpe til med å redusere fragmentering.

Avslutningsvis, grensene for strdup() funksjon avgjøres ofte ved hjelp av minnet på gadgeten, lengden på dynamisk tildelte minneblokker og eventuelle implementeringsnøyaktige forskrifter. Håndtere minneallokering skru-ups og vurdere sikkerhetsproblemer når du bruker strdup() funksjon å kopiere strenger er avgjørende.