Pointer auf function return CHAR liefert nicht den richtigen Wert



  • Hi,
    hab folgendes programm erstellt was mir jenach Anwendung eine unterschiedliche Anzahl von IP-Adressen aus einer Datei liest. Problem ist das nichts richtiges Rauskommnt, vermute das es was mit der Speicher zuweisung zu tun hat. Falls jemand nen Tipp hat bin ich SEHR SEHR DANKBAR!

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

    FILE *file;
    char *getIP(void);

    int main (int argc, const char * argv[])
    {
    fopen("/tmp/parameter.txt","r")) == NULL)

    char *ipAddr = (char*)getIP();

    printf("\nIP Adresse: %s",ipAddr);

    fclose(file);

    return(0);
    }

    char *getIP(void)
    {
    char ipAddr[16], *globalIpAddr;

    fscanf(file, "%*s %15s", &ipAddr);

    globalIpAddr = ipAddr;

    printf(" ***IP Adresse: %s", globalIpAddr);

    return (globalIpAddr);
    }

    Ausgabe:
    ***IP Adresse: 192.168.155.101
    IP Adresse: 192.168.155.4???D

    Wie man sieht ist String in der Funktion noch vollständig, nicht aber sobald er weiter ins main() gegeben wird.

    Danke schon mal 🙂



  • Bitte benutz Code-Tags, wenn du Code postest! ( sdfs )

    Das dein Code nicht funktioniert, liegt daran, dass ipAddr am Ende von getIP nicht mehr existiert. Du darfst also keinen Zeiger darauf zurück geben.



  • Ok klinkt logisch, da ipAddr eine lokale Variable ist existiert sie nur in der Funktion getIP().

    Warum funktioniert dann folgende Funktion?

    int getStationID(void)
    {
    	int stationID, *globalStationID;
    
    	fscanf(file, "%*s %2d", &stationID);
    
    	globalStationID = &stationID;
    
    	return(*globalStationID);
    }
    

    ..und wie schaffe ich es es nun aus ipAddr eine globale variable zu machen oder in die main() Funktion mit zu nehmen?

    noch mal der code mit den besagten Tags:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    FILE *file;
    char *getIP(void);
    
    int main (int argc, const char * argv[]) 
    {
    	fopen("/tmp/parameter.txt","r")) == NULL)
    
    	char *ipAddr = (char*)getIP();
    	int *stationID = (int*)getStationID();
    
    	printf("\nIP Adresse: %s",ipAddr);
        printf("\nStationID: %i", (int*)stationID);
    
    	fclose(file);
    
    	return(0);
    }
    
    char *getIP(void)
    {
    	char ipAddr[16], *globalIpAddr;
    
    	fscanf(file, "%*s %15s", &ipAddr);
    
    	globalIpAddr = ipAddr;
    
    	printf(" ***IP Adresse: %s", globalIpAddr);
    
    	return (globalIpAddr);
    }
    


  • Willy schrieb:

    Warum funktioniert dann folgende Funktion?

    int getStationID(void)
    {
    	int stationID, *globalStationID;
    	
    	fscanf(file, "%*s %2d", &stationID);
    	
    	globalStationID = &stationID;
    	
    	return(*globalStationID);
    }
    

    weil 'ne kopie des wertes zurückgegeben wird. zum zeitpunkt der dereferenzierung ist 'stationID' ja noch gültig.

    Willy schrieb:

    ..und wie schaffe ich es es nun aus ipAddr eine globale variable zu machen oder in die main() Funktion mit zu nehmen?

    einfach ausserhalb von funktionen anlegen, dann ist sie global und kann von 'main' und anderen funktionen benutzt werden.
    🙂



  • Danke!



  • Globale Variablen verursachen oft mehr Probleme. Der übliche Weg unter C ist

    void getIP(char *ipAddr, size_t n) {
      // ...
    }
    
    int main() {
      enum { N = 16 };
      char ipAddr[N];
      getIP(ipAddr, N);
    }
    


  • rüdiger schrieb:

    Der übliche Weg unter C ist

    üblicherweise nimmt man kein einsames 'enum N', sondern hat'n typedef für die IP-adresse.
    🙂


Log in to reply