2016-07-20 12 views
0

Mit der Anweisung printf printf("new s3 string (in locate function) is \"%s\" \n",s3) arbeitet CodeWie ändert printf den Rückgabewert einer Funktion?

richtig, aber wenn printf("new s3 string (in locate function) is \"%s\" \n",s3) kommentiert wird, kehrt der Code null

wie wird printf den return Wert zu beeinflussen?

#include <stdio.h> 
#include <string.h> 

char * locate(char * s1,char * s2,int index) 
{ 
    printf("s1 string is \"%s\" \n",s1); 
    printf("s2 string is \"%s\" \n",s2); 

    int i=0,j=0, k; 
    char s3[100];  

    while(i<=index) 
    { 
     s3[i]=s1[i]; 
     i++; 
    } 
    k=i; 

    while(s2[j]!='\0') 
    { 
     s3[i]=s2[j]; 
     i++; j++; 
    } 

    while(s1[k]!='\0') 
    { 
     s3[i]=s1[k]; 
     i++;k++; 
    } 

    s3[i]='\0'; 

    //printf("new s3 string (in locate function) is \"%s\" \n",s3); 

    return ((char *)s3); 
} 


int main(void) 
{ 
    char * s1="my name shwetha"; 
    char * s2="is "; 
    s1=locate(s1,s2,7); 

    printf("Final Inserted string S1 is \"%s\" \n",s1); 

    return 0; 
} 
+0

Mögliches Duplikat von [Rückgabe einer lokalen Variablen aus Funktion in C] (http://stackoverflow.com/questions/4824342/returning-a-local-variable-from-function-in-c) –

Antwort

8

s3 geht out of scope (es lässt die Funktion es erstellt wurde in), so hat es das Verhalten oder so nicht definiert. Sie müssen entweder s3 in main erstellen und als weiteren Parameter übergeben oder die Heap-Zuweisung über malloc() verwenden, die vom Betriebssystem verwaltet wird.

+0

Nur ein Vorschlag, anstelle von _ "es bleibt die Funktion, in der es erstellt wurde" _, wäre es geeignet zu sagen, dass es vom Stapel befreit ist, da die Funktion, in der es deklariert ist, beendet wird. – ameyCU

1

Ihr Code gibt den Zeiger auf die lokale Variable s3 zurück. Als solcher deklariert, geht es außerhalb des Geltungsbereiches (wird vom Stapelspeicher freigegeben) unter return; Wenn der Programmierer es vernachlässigt, ist es ein üblicher "Generator" für das undefinierte Verhalten des Programms. Zwei Lösungen sind möglich:

  1. Dynamische Zuweisung (und anschließende Freigabe) der Variablen, wie in der anderen Antwort vorgeschlagen.
  2. Ändern der Speicherdauer der Variablen, indem er erklärt, es static char s3[100]

Bitte, auch diese related SO post sehen.

+0

char * s4 = s3; Rückkehr (s4); Wird das auch funktionieren? Weil char * im Datensegment richtig gespeichert ist? Also sollte es nach dem Beenden der Funktion verfügbar sein, richtig? – PyRookie

+0

Sie geben dem zurückgegebenen _pointer_ nur einen lokalen Namen, @PyRookie, so dass sich nichts anderes für den Compiler ändern sollte: Der Speicher, auf den er zeigt, bleibt gleich. Wenn Sie neugieriger sind, versuchen Sie, in die Assemblersprache zu kompilieren und vergleichen Sie die resultierenden Codes Zeile für Zeile. (-: – user3078414

Verwandte Themen