Was läuft im main schief ?



  • char* itoa(int x)
    {
        char arr[20];
    
    	int i=0;
    
    	do{
             arr[i++]=x%10+'0';
    
           }
    
    	 while((x/=10)>0);
    
    	 arr[i]=0;
    
         return arr;
    
    }
    
    int main()
    {
    
    char* x;
    
    x=itoa(123);   // hier scheint was nicht zu passen ??
    
    std::cout <<x;
    
    }
    


  • arr wird beim Verlassen der Funktion zerstört, x ist also ungültig.



  • stimmt 🙂

    aber der Inhalt von arr wird doch in den Rückgabewert kopiert und
    dieser dann zurückgeliert.

    wenn ich in einer funktion eine temporäre Variable anlege und diese
    dann zurückliefer wird diese doch auch kopiert.



  • blurry333 schrieb:

    aber der Inhalt von arr wird doch in den Rückgabewert kopiert und
    dieser dann zurückgeliert.

    Nein. Es wird lediglich ein Zeiger auf den Anfang des Arrays zurückgegeben. Mit dem kannst du ausserhalb der Funktion nichts anfangen.

    blurry333 schrieb:

    wenn ich in einer funktion eine temporäre Variable anlege und diese
    dann zurückliefer wird diese doch auch kopiert.

    Ja, aber du gibst keine Zeiger auf lokale Variablen zurück. Hier hast du die Typen char[20] und char* , wobei das Array bei der Rückgabe in den Zeiger konvertiert wird, und du keinen Zugriff mehr auf die Elemente des Arrays hast.

    Übrigens: Benutze bitte keine manuellen Zeilenumbrüche, das Forum bricht automatisch um (was etwas angenehmer zum Lesen ist).



  • blurry333 schrieb:

    aber der Inhalt von arr wird doch in den Rückgabewert kopiert und
    dieser dann zurückgeliert.

    wenn ich in einer funktion eine temporäre Variable anlege und diese
    dann zurückliefer wird diese doch auch kopiert.

    So ist es.
    arr kann in einen Zeiger umgewandelt werden und einen solchen gibt die Funtkion auch zurück. Beim Zurückgeben wird der Zeiger kopiert. Nicht der Inhalt des Arrays - den gibt es nach Verlassen der Funktion nicht mehr.

    Edit: zu spät.



  • das hier lässt der compiler auch nicht durchgehen.
    Er checkt wohl dass 2 zeiger auf denselben Speicher zeigen.

    int main()
    {
    
    char* x="Hallo";
    
    char* y=x;
    
    y[1]='o';
    
    std::cout<<x;
    
    }
    


  • blurry333 schrieb:

    Er checkt wohl dass 2 zeiger auf denselben Speicher zeigen.

    Nein. Das "Hallo" ist eine Konstante und darf nicht geändert werden. Meistens liegen diese Konstanten im Datenbereich der Executable und werden zusammengefasst wenn sie öfters vorkommen. Der Datenbereich wird vom Betriebssystem in der Regel Read Only gesetzt und daher tritt eine Schutzverletzung auf wenn du über den Zeiger schreibend darauf zugreifst.


Anmelden zum Antworten