2016-05-12 4 views
-5

//////return-Anweisung in einer for-Schleife

char* duplicate(char* string, int count) 
{ 
    char* duped = (char*) malloc(sizeof(char)*(count*strlength(string)+1)); 
    int i=0,j=0,t=0; 
    for(i=0; i<count*strlength(string); i++,j++) 
    { 
     if (j==(strlength(string))) 
     { 
      j=0; 
      t++; 
     } 

     if (t==count) 
     { 
      duped[i] = '\0'; 
      break; 
     } 

     duped[i] = string[j]; 
    } 

    return duped; 
} 

Der obige Code funktioniert perfekt, aber das eine unten gibt einen Segmentation Fault. Was ist der Unterschied zwischen ihnen? Sollte eine Funktion nicht anhalten, wenn sie zurückkehrt?

char* duplicate(char* string, int count) 
{ 
    char* duped = (char*) malloc(sizeof(char)*(count*strlength(string)+1)); 
    int i=0,j=0,t=0; 
    for(i=0; i<count*strlength(string); i++,j++) 
    { 
     if (j==(strlength(string))) 
     { 
      j=0; 
      t++; 
     } 

     if (t==count) 
     { 
      duped[i] = '\0'; 
      return duped; 
     } 

     duped[i] = string[j]; 
    } 
} 
+0

[Bitte lesen Sie diese Diskussion darüber, warum der Rückgabewert von 'malloc()' und Familie in 'C' nicht umgewandelt werden soll.] (Http://stackoverflow.com/q/605845/2173917). –

+3

Bitte korrigieren Sie den Einzug, hoffe die Hälfte Ihres Problems wird sortiert, wenn nicht mehr. \ –

+1

Was ist 'strlength()'? Warum benutzt du es anstatt des Standard 'strlen()'? –

Antwort

1

Was passiert, wenn string 0 Länge ist oder count 0? In Ihrem zweiten Fall geben Sie keinen Wert zurück.

Dies sollte einen Compiler Warnung geben und wird wahrscheinlich einen Absturz verursachen, wie es zurückgibt, was es will.


bearbeiten

Ok, das Problem ist tiefer - Sie bekommen nie auf den Teil des Codes, der die ‚\ 0‘ in der for-Schleife mit den Anfangsbedingungen („Zoom“ und 3 Sätze). Daher könnte Ihr String auch nicht diesen Terminator gesetzt haben, abhängig davon, wie nett es sich malloc anfühlt. Sie müssen den NUL-Wert festlegen, wenn eine Zeichenfolge vorhanden ist, selbst wenn Sie die for-Schleife beenden. Dies ist der Grund, warum die zweite fehlgeschlagen ist und nicht die erste - sie hat tatsächlich die Rückkehrerklärung verfehlt.

+0

Das ist nicht der Fall. String ist "Zoom" und zählt 3. – onur

+0

Und es wirft Compiler-Warnungen und hat einen bestimmten Fail Case, der UB aufruft, die Sie ignorieren. Das heißt, Sie haben immer noch nicht gesagt, welche Linie oder wo der Seg-Fehler auftritt. Das würde helfen, die Dinge einzugrenzen. –

+0

Entschuldigung für die Unannehmlichkeiten. Ich bin einfach zu Neuling, alles, was ich im Terminal sehe, ist "Segmentation fault (core dumped)". Ich wäre mehr als glücklich, wenn Sie mir sagen, wie ich sehen kann, welche Zeile den Fehler verursacht. – onur

Verwandte Themen