logo

strdup()-funktionen i C

I den här artikeln kommer du att lära dig om funktionen strdup() i C med dess syntax, exempel, komplexitet, fördelar och nackdelar.

De strdup() funktion duplicerar en tillhandahållen sträng i programmeringsspråket C. Den accepterar en sträng med en ogiltig uppsägning som ett argument. Det utgångar en pekare till en ny dynamiskt allokerad sträng som är en dubblett (d.v.s. en exakt kopia ) för inmatningssträngen.

De strdup() funktion är inte en del av vanligt C-bibliotek . Det erbjuds dock ofta som en komponent i strängmanipuleringsverktygen på olika plattformar. Den definieras enligt följande:

Syntax:

Den har följande syntax:

 char *strdup(const char *str); 

Motivet till strdup() funktion är att skapa en dubbelkopia av en given sträng. Det tar en null upphörd sträng str som dess argument och returnerar en pekare till en helt ny dynamiskt tilldelad sträng som är en verklig kopia av den autentiska strängen.

harald baldr

Här är en steg-för-steg uppdelning av hur strdup() fungerar normalt:

  1. Funktionen beräknar längd av ingången sträng str använda strlen() funktion . Det är slutfört för att bestämma mängden minne som krävs för att lagra dubblettsträngen.
  2. Den tilldelar en nytt minnesblock att behålla dubblettsträng använda malloc() funktion . Storleken på minnesblocket bestäms genom att inkludera 1 i längden av inmatad sträng . De extra 1 är för nolltecken ('') som avslutar strängen.
  3. Om minnesallokering är misslyckades , den strdup() funktion kommer också korrekt att returnera en nollpekare ( malloc() gör detsamma). Undersöker strdup() funktionsreturvärde är avgörande för att hantera sådana omständigheter.
  4. De funktionens slutliga utdata är en pekare till det nya allokerade minnesblocket som innehåller dubblettsträngen.

Vi måste lägga märke till följande problem när vi använder strdup() funktion :

De strdup() funktion tilldelar dynamiskt minne för reproduktionssträngen. Därför är det programmerarens ansvar att släppa detta minne när det är miles nu inte önskade användningen av loose() egenskap . Om minnet inte frigörs kan det leda till minnesläckor.

Det är vanligtvis ett bra val att undvika att använda strdup() funktion på stora strängar eller i situationer där minnesallokering kommer att vara ämne . Sedan strdup() funktion dynamiskt allokerar minne, kan det misslyckas utan en otillräcklig 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! 

Förklaring:

Inkludera viktiga rubrikdokument:

    stdio.h används för in-/utgångsoperationer . String.h används för strängmanipuleringsfunktioner. Stdlib.h används för dynamisk minnesallokering Funktioner.

Definiera variabler:

  • Unik är en pekare till en konstant sträng 'Hej världen!' . Denna sträng är den vi behöver replikera.
  • De kopia är en pekare till en person. Det kommer att spara dubblettsträngen skapad med strdup() .

Ring strdup():

  • De strdup() funktion kallas, passerar originalsträng som en argument . Det skapar en kopia av originalsträng och returnerar en pekare till den duplicerade strängen. Denna pekare är tilldelad duplikatvariabeln.

Kontrollera om minnesallokering blir en träff:

hur man hittar bildskärmsstorlek
  • Programmet undersöker om en dubblett inte är en nollpekare . Om strdup() funktion var en hit när det gäller att tilldela reminiscens för dubblettsträngen, en dubblett kommer nu inte att vara null .

Skriv ut original och duplicerade strängar:

  • Om minnesallokering blir a träffa , detta system skriver ut äkta och kopior strängar med hjälp av printf()-satser . De %s formatspecifikator är van vid skriva ut strängar .

Ledigt dynamiskt allokerat minne:

  • Efter att ha skrivit ut strängarna anropar detta system gratis (dubblett) att starta dynamiskt allokerat minne . Detta steg är avgörande för att hålla sig borta från reminiscensläckor.

Hantera minnesallokeringsfel:

  • Om minnesallokeringen misslyckades (dvs strdup() funktion nedre delen av ryggen a nollpekare ), skriver programmet ut en felmeddelande vilket indikerar att minnesallokering misslyckades.

Retur från main():

  • Programmet ger 0 , indikerar framgångsrikt utförande , till arbetsenheten.

Sammantaget visar denna applikation användningen av strdup() funktion att kopiera en sträng, tester för en lyckad reminiscensfördelning, och grafik de autentiska och kopieringssträngarna. Den hanterar också situationen då reminiscensallokering misslyckas.

Komplexitetsanalys:

De tid och rymdkomplexitet av strdup()-funktionen kan analyseras enligt följande:

Tidskomplexitet:

  • De tidskomplexitet av strdup() funktion kan anses linjär eller På) , i vilken n är längden på inmatningssträng . Det beror på det faktum strdup() innebär två primära operationer:
  • Beräknar varaktigheten för den angivna strängen:De strlen() funktion används vanligtvis för att bestämma längden på inmatningssträngen. Den itererar över strängens tecken tills den möter null individ ('') . Denna operation tar O(n) tidskomplexitet , i vilken n är perioden för sträng .Kopiera strängen:De kopieringsoperation uppnås genom strcpy() funktion eller den memcpy() funktion tar O(n) tidskomplexitet lika fint. Det innebär att man itererar över varje individ av den inmatade strängen och kopierar den till det nyligen tilldelade reminiscensblocket.
  • Därför kan den totala tidskomplexiteten för strdup() approximeras som På) , var n är perioden för inmatningssträng .

Utrymmes komplexitet:

  • De rymdkomplexitet av strdup() funktion är likaledes linjär eller På) , i vilken n är varaktigheten av inmatningssträng . Det är på grund av strdup() tilldelar dynamiskt minne för reproduktionssträngen, vilket kräver ett extra område för att lagra de kopierade tecknen.
  • Mängden minne som tilldelas bestäms genom att använda skalan för den inmatade strängen, n + 1 , var n är längd av inmatningssträng . Det extra '+1' är för null individ ('') . Den är bifogad till dubbletter av strängar sluta för att säkerställa att det är mil null upphörd .
  • Därför den övergripande rymdkomplexitet av strdup() är På) , i vilken n är varaktigheten av inmatningssträng .

Det är värt att notera att realtid och utrymmesbehov kan drabbas av faktorer, minneshanteringsoverhead, maskinspecifika optimeringar , och implementeringsdetaljerna för C-biblioteket som börjar användas. Dessa komplexitet fungera som en föredragen riktlinje för att känna igen de övergripande prestandaegenskaperna hos strdup() funktion .

Egenskaper för strdup() i C:

De strdup() funktion i C har följande egenskaper:

Strängduplicering: Det viktiga motivet för strdup() funktion är att skapa en reproduktionsdubblett av en given sträng. Den allokerar minne för dubblettsträngen och kopierar innehållet i den autentiska strängen till det nyligen allokerade minnesblocket.

array lägga till element java

Dynamisk minnesallokering: De strdup() funktion tilldelar dynamiskt minne för dubblettsträng att använda malloc() egenskap . Denna metod som minnet allokeras vid körning och kan startas med hjälp av free()-funktionen medan det nu inte behövs.

Null uppsägning: De dubblettsträng skapad av strdup() funktion är likaså null upphörd , ungefär som autentisk sträng . De null individ ('') läggs till överst på reproduktionssträngen för att markera att strängen avslutas.

Returnerad pekare: De strdup() funktion returnerar en pekare till det nyligen tilldelade reminiscensblocket som innehåller dubblettsträng . Pekaren pekar på den första individen i dubblettsträngen.

Felhantering: Om reminiscensfördelningen misslyckas, strdup() funktion returnerar a nollpekare för att beteckna misslyckandet. Testa returvärdet för strdup() funktion att hantera sådana scenarier och rädda dig från att komma åt minne som inte har tilldelats framgångsrikt är avgörande.

Portabilitet: Även om strdup() funktion är inte alltid en del av det vanliga C-biblioteket, det är vanligtvis tillgängligt på många system som en del av strängmanipuleringsverktygen. Tillgängligheten kan dock variera beroende på specifik plattform eller kompilator .

Ansvar för minneshantering: När du använder strdup() funktion , måste programmeraren lossa det dynamiskt tilldelade minnet för att använda free() funktion så fort det inte önskas. Att misslyckas med att uppnå detta kan leda till minnesläckor och kan syftet med programmet att sluka överdriven reminiscens genom åren.

Kompatibilitet med standardsträngsfunktioner: De dubblettsträng returneras av strdup() funktion kan användas med olika trendiga C-strängar, eftersom det är långt en noll-terminerad sträng . Det släpper in för ren integration med nuvarande kod som manipulerar strängar.

Fördelar med strdup() i C:

Det finns flera fördelar med strdup() funktion i C. Några huvudfördelar med strdup()-funktionen är följande:

Bekvämlighet och enkelhet: De strdup() funktion effektiviserar processen att kopiera en sträng genom att slå samman minnesallokering och strängkopiering metoder till ett enda funktionsanrop. Som ett resultat av detta komplexitet och läsbarhet i koden är båda minskat , och utvecklare slipper skriva unik kod för att utföra dessa aktiviteter.

Kodläsbarhet och underhållbarhet: Använda strdup() funktion , blir koden mer läsbar och självförklarande. Funktionsanropet avser verkligen att duplicera en sträng, vilket förbättrar kodläsbarheten. Det minskar också möjligheten att introducera buggar associerade med guideminnestilldelning och strängkopiering, vilket resulterar i extra underhållbar kod.

Kodåteranvändbarhet: De strdup() funktion möjliggör skapandet av återanvändbara kodtillsatser. Genom att kapsla in det utmärkta omdömet för att duplicera en sträng direkt i en separat funktion, kan du enkelt återanvända funktionen i flera delar av din kodbas. Det främjar kodmodularitet och minskar redundans.

Flexibilitet med minnesallokering: Sedan strdup() funktion dynamiskt allokerar minne för dubblettsträngen, ger det flexibilitet vid hantering av strängar av olika längd. Du behöver inte oroa dig för dimensionsgränserna för buffertar med fast storlek. Det är särskilt användbart när du hanterar indatasträngar av okänd eller varierande längd.

Undvika buffertspill: Bufferten svämmar över uppstår när informationen överskrider det tilldelade reminiscensutrymmet, vilket kan resultera i säkerhetsbrister och programkrascher. Använda strdup() funktion , kan du undvika problem med buffertspill eftersom funktionen rutinmässigt allokerar minne helt baserat på varaktigheten av den angivna strängen.

Minnesoptimering: I vissa fall använder du strdup() funktion kan resultera i minnesoptimering. Till exempel, när flera variabler pekar på lika stränginnehåll, duplicera strängen med strdup() kan minska minnesutnyttjandet genom att allokera separat minne för varje variabel istället för att duplicera hela minnesinnehållet.

Begränsningar/nackdelar för strdup() i C:

De strdup() funktion i C har inga specifika gränser definierade av det utbredda C-språket. Den underliggande enheten och tillgängliga tillgångar motiverar dock dess beteende och begränsningar. Här är några frågor om gränser medan användningen av strdup() funktion :

Tillgängligt minne: Begränsningen nummer ett för strdup() funktion är tillgänglighet av reminiscens i systemet. Sedan strdup() funktion tilldelar dynamiskt reminiscens för reproduktionssträngen med hjälp av malloc() , kan mängden reminiscens som är tillgänglig för allokering begränsa skalan på strängen som kan dupliceras. Om det inte finns tillräckligt med minne för att allokera dubblettsträngen, strdup() funktion kommer att misslyckas och returnerar a nollpekare .

Maximal stränglängd: Den maximala perioden för en sträng som kan dupliceras med strdup() funktion bestäms genom skalan på det reminiscensblock som kan tilldelas. På maximala system motiveras den maximala storleken på ett dynamiskt allokerat reminiscensblock av faktorer inklusive tillgängligt fysiskt minne och maskinens struktur. De size_t datatyp , som används för att representera skalan av reminiscensblock, kan införa en gräns för den mest strängade perioden.

Implementeringsspecifika gränser: De strdup()-funktionen kan ha implementeringsspecifika gränser införda genom systemet eller C-biblioteket som används. Dessa gränser kan variera mellan specifika system och kompilatorer. Det rekommenderas att konsultera dokumentationen eller plattformsunika tillgångar för att förstå eventuella särskilda begränsningar som införs genom implementeringen.

Säkerhetsöverväganden: När du använder strdup() funktion , är det viktigt att vara medveten om kapacitetssäkerhetsrisker, inklusive buffer-överflöde sårbarheter. Sedan strdup() funktion tilldelar reminiscens baserat på varaktigheten av den angivna strängen, om den angivna strängen är otillförlitlig eller av en okänd period, är det avgörande att validera och sanera indata för att förhindra buffertspill eller andra säkerhetsbrister.

oracle sql inte lika

Multithreading och samtidighet: När du använder strdup() funktion i en omgivning med flera trådar eller samtidigt, är det viktigt att säkerställa korrekt synkronisering och trådsäkerhet. Om flera trådar försöker duplicera strängar samtidigt, tävlingsförhållanden och minneskorruption kan uppstå. Korrekt synkroniseringsmekanismer , Till exempel lås eller trådsäker minnesallokering , måste användas för att mildra dessa problem.

Minnesfragmentering: Frekvent användning av strdup() funktion kan bidra till minnesfragmentering över tid. Minnesfragmentering händer när olåst minne delas upp i små , icke sammanhängande block, gör det utmanande att allokera stora minnesblock . Även om det tillgängliga minnet räcker, kan det utan tvekan orsaka skruvningar i reminiscensallokeringen. Strategier som samling av minnesbilder eller anpassad reminiscens fördelare kan hjälpa till att mildra fragmentering.

Sammanfattningsvis, gränserna för strdup() funktion bestäms ofta med hjälp av minnet på gadgeten, längden på dynamiskt allokerade reminiscensblock och eventuella implementeringsexakta bestämmelser. Hantera minnesallokering skruvar och överväga säkerhetsproblem när du använder strdup() funktion att kopiera strängar är avgörande.