warnung???



  • hi zusammen,
    by einem kleinen test-prog bekomme ich eine warnung... und ich schnall' nicht wieso. Ich habe immer gedacht dass das so richtig sein sollte...

    die Anwendung:

    #include <stdio.h>
    #include <string.h>
    
    char *fnFunktion (void) ;
    
    int main (void){
    	char szTest[10] ;
    	szTest[0] = '\0' ;
    	strcpy (szTest, fnFunktion ()) ;
    	szTest[strlen (szTest)] = '\0' ;
    	printf ("%s", szTest) ;
    	return 0 ;
    }
    
    char *fnFunktion (void){
    	char szVariable[10] ;
    	szVariable[0] = '\0' ;
    	strcpy (szVariable, "Hallo") ;
    	szVariable[strlen (szVariable)] = '\0' ;
    	return szVariable ;
    }
    

    und hier die warnmeldung:
    *D:\a.cpp(20) : warning C4172: Adresse einer lokalen Variablen oder eines temporaeren Wertes wird zurueckgegeben

    a.obj - 0 Fehler, 1 Warnung(en)
    *



  • Ist die Warnung nicht selbst erklärend? Das zurückgeben eines Pointers auf toten Speicher ist eben ein Fehler. Vermutlich wird es erstmal funktionieren, aber irgendwann beißt es dich, und du debuggst dir nen Wolf.



  • Hat nichts mit der Warnung zu tun, aber...

    lol schrieb:

    szTest[0] = '\0' ;
    

    das ist überflüssig, wenn du danach strcpy benutzt, und...

    szTest[strlen (szTest)] = '\0' ;
    

    das ist, als würdest du sagen: "Suche nach der Stringende-Markierung, und mach dann da eine Stringende-Markierung hin."



  • und wie musste so 'ne funktion richtig aussehen?

    thx



  • Hallo!

    Vielleicht so:

    #include <stdio.h> 
    #include <string.h> 
    
    int main (void){ 
        char *hallo = "Hallo";
        char *szTest; 
        szTest = (char *)malloc((strlen(hallo)+1)*sizeof(char)); 
        if (szTest == NULL)
        {
            printf("Mist!!");
            return (1);
        }
        strcpy (szTest, hallo);  
        printf ("%s", szTest);
        free (szTest);   
        return 0 ; 
    }
    

    Gruß
    Michael



  • oder so:

    #include <stdio.h>
    #include <string.h>
    
    void fnFunktion (char*) ;
    
    int main (void){
    	char szTest[10] ;
            fnFunktion(szZest);
    	printf ("%s", szTest) ;
    	return 0 ;
    }
    
    void fnFunktion (char* szVariable){
    	strcpy (szVariable, "Hallo") ;
    }
    

    Von Stilsachen abgesehen (Beispielsweise sind feste char-Arrays, die blind von irgendwelchen Funktionen mit Daten gefüllt werden, immer verdächtig -- die meisten Sicherheitslücken gehen nunmal auf Buffer Overflows zurück)



  • thx, endlich habe ich es kapiert.



  • char *fnFunktion (void){
    char szVariable[10] ;
    szVariable[0] = '\0' ;
    strcpy (szVariable, "Hallo") ;
    szVariable[strlen (szVariable)] = '\0' ;
    return szVariable ;
    }

    Sorry, aber toter Speicherbereich ist so nicht richtig.
    szVariable ist so wie die Warnung sagt, eine lokale Variable. Lokal, weil du sie innerhalb eines Blocks (also zwischen {}) deklariert hast. Alle lokalen Variablen haben nur innerhalb dieses Blocks ihre Gültigkeit. Am Blockende, ist der Speicherbereich für diese Variable hinfällig, denn dann kann dieser Speicherbereich evtl. durch eine neue Variable belegt werden, da die lokale Variable ihre Gültigkeit verloren hat. Wenn du unbedingt, die Adresse der Variablen zurückgeben willst, dann mache aus der lokalen eine statische lokale Variable. Also...

    char *fnFunktion (void){
    static char szVariable[10] ;
    szVariable[0] = '\0' ;
    strcpy (szVariable, "Hallo") ;
    szVariable[strlen (szVariable)] = '\0' ;
    return szVariable ;
    }



  • Du nennst es ungültig, ich nenn es tot. Sorry, aber such dir besser unbeantwortete Fragen ...



  • @Bashar

    Hier zweifelt wohl keiner, dass du das richtige gemeint hast, allerdings hat deine Antwort - im Gegensatz zu der von KayCee - einem Newbie wahrscheinlich gar nichts geholfen.
    Also bitte nicht gleich so hochtrabend.



  • danke schrieb:

    thx, endlich habe ich es kapiert.


Anmelden zum Antworten