2016-05-10 6 views
2

Ich arbeite an der Implementierung von strdup() in C, ich bin neu in C und ich versuche, meine eigene Bibliothek zu erstellen. Ich verwende die tatsächliche strdup() von string.h, um meine zu testen, und ich laufe in einen Busfehler, wenn ich meine Quelle gegen ein Hauptprogramm aber keine prüfe, wenn ich den tatsächlichen strdup() benutze. Ich kann auch keine vorhandenen Funktionen außer malloc() verwenden.Implementierung von strdup() in C-Programmierung

Quellcode:

#include <stdlib.h> 

char *ft_strdup(char *src) 
{ 

    char *str; 
    int len; 

    while (src[len]) 
     len++; 
    str = (char*)malloc(sizeof(*str) * (len+1)); 
    while (*src) 
     *str++ = *src++; 
    *str = '\0'; 
    return (str); 
} 

Warum einen Busfehler ich immer noch zu bekommen?

+6

Sie vermissen zu initialisieren 'len' mit 0 – Ctx

+1

* I C neu bin und ich versuche, meine eigene Bibliothek * zu bauen - in der Regel keine gute Idee. Ich habe C schon viele Jahre zuvor benutzt [ich habe meine eigene Standardbibliothek erstellt] (http://pdclib.e43.eu/), und ich bin noch viele Jahre später dabei. Die '' Funktionen sind im Allgemeinen ganz einfach, aber Sie werden schnell Probleme bekommen (oder implementieren Sie die Funktionen zu naiv, so dass Sie ein frustrierend gebrochenes Projekt haben). Versuchen Sie etwas auf der Benutzerseite der Standardbibliothek für Ihre ersten Schritte. – DevSolar

+0

@ user3121023 Danke, wie gebe ich den Zeiger zurück an den Anfang? – adot

Antwort

6

Versuchen folgende Update:

  1. initialisieren len bevor es Zuwachs.
  2. Don't cast malloc's return value und tut sizeof(char) nicht verwenden, ist es definiert ist im Standard zu 1, pro CSTD 6.5.3.4p4:

    Wenn sizeof auf einen Operanden angewendet wird, oder hat char, unsigned char-Typ signed char (oder eine qualifizierte Version davon) ist das Ergebnis 1.

  3. einen Zeiger auf den ursprünglichen str Zeiger

sparen
#include <stdlib.h> 

char *ft_strdup(char *src) 
{ 
    char *str; 
    char *p; 
    int len = 0; 

    while (src[len]) 
     len++; 
    str = malloc(len + 1); 
    p = str; 
    while (*src) 
     *p++ = *src++; 
    *p = '\0'; 
    return str; 
} 
+0

Danke sehr hilfreich. – adot

+0

Können Sie bitte Punkt 2 erklären? In Bezug auf das Casting von Malloc und Verwendung von sizeof? – adot

+0

@afullstopdot Sicher, ich habe den Beitrag für den Grund von Punkt 2 aktualisiert. – fluter

1

Wenn Sie Ihre eigene strdup Funktion implementieren müssen, verlassen Sie sich zumindest auf den Rest von string.h für so viel wie Sie können. Viele dieser Funktionen sind optimiert und schneller als Sie selbst schreiben können. Zum Beispiel verwendet strlen wahrscheinlich SSE-Anweisungen, während Ihre manuelle Suche nach dem Null-Terminator-Byte nicht erfolgt. Es ist auch weniger Code, der immer besser ist. Kurz gesagt, ich würde das vorschlagen:

#include <stdlib.h> 
#include <string.h> 

char *ft_strdup(char *src) 
{ 
    char *str; 
    char *p; 
    size_t len = strlen(src); 

    str = malloc(len + 1); 
    if (str) { 
    memcpy(str, src, len + 1); 
    } 
    return str; 
} 
+0

Sie haben vergessen, die Zeichenfolge auf Null zu setzen. 'str [len] = '\ 0''. Bitte bearbeiten Sie Ihren Beitrag und korrigieren Sie diesen. – Lundin

+0

'char * ft_strdup (const char * str) {Rückkehr strcpy (malloc (strlen (src) +1), str); } ';-) –

+0

Aber natürlich hat die Funktion des op, deins und meins, alle eine falsche Semantik, insofern als das echte' strdup() '' NULL' bei Allokationsfehler zurückgibt, kein 'Segmentierungsfehler'! –