Fehlerhafter Umgang mit Zeigern?



  • Hi,

    ich habe ein Problem. Irgendwo im Code von strcpyNew(char*, char*) ist ein Fehler, der zum Programmabsturz führt. Sobald ich s1 irgendeinen Wert zuweisen möchte, stürzt das Programm ab. Findet jemand den Fehler?

    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    void strcpyNew(char *s1, char *s2);
    int main()
    {
        char text[100]="Hallo, wie geht es dir?";
        char *text2;
        strcpyNew(text2, text);
        getch();
    }
    
    void strcpyNew(char *s1, char *s2)
    {
          while(*s2 != '\0')
          {     
              *s1++ = *s2++;
          }
          *s1='\0';
    }
    


  • Dann überleg dir mal, wohin du kopierst.



  • Eine Speicherallokation für s1 fehlt. Variablen werden in C++ aber doch nicht mit einem Wert initialisiert und zeigen nach der Deklaration auf irgendeine Speicherstelle im Rechner. Klappt es ohne die Allokation also nur in manchen Fällen, weil sonst eine Zugriffsverletzung auftritt?



  • Sobald ich s1 irgendeinen Wert zuweisen möchte, stürzt das Programm ab.

    Du weisst aber nicht s1 einen Wert zu, sondern auf das worauf s1 zeigt.



  • knivil schrieb:

    Sobald ich s1 irgendeinen Wert zuweisen möchte, stürzt das Programm ab.

    Du weisst aber nicht s1 einen Wert zu, sondern auf das worauf s1 zeigt.

    Ja, war von mir ungenau formuliert. s1 zeigt auf irgendeine Adresse. Wenn ich jetzt s1 derefenziere und einen neuen Wert zuweise ohne vorher Speicher zu allokieren, stürzt das Programm ab. Liegt das an einer Speicherzugriffsverletzung?



  • Phisherman schrieb:

    Ja, war von mir ungenau formuliert. s1 zeigt auf irgendeine Adresse. Wenn ich jetzt s1 derefenziere und einen neuen Wert zuweise ohne vorher Speicher zu allokieren, stürzt das Programm ab.

    Warum denkst du, dass das funktionieren sollte? Du kannst doch nicht einfach irgendwo wild in den Speicher schreiben!



  • Ich lern zur Zeit C++ mit dem Skript vom RWTH Aachen. Von dort ist der von mir oben gepostete Code (L48): http://www.gia.rwth-aachen.de/Lehre/Cpp/script/PROGRAMS/arrays-strcpy.c

    Wenn ich deren Funktion verwenden würde, würde ich nicht davon ausgehen, dass ich vorher Speicher anfordern muss, um den String kopieren zu können.



  • Phisherman schrieb:

    Ich lern zur Zeit C++ mit dem Skript vom RWTH Aachen. Von dort ist der von mir oben gepostete Code (L48): http://www.gia.rwth-aachen.de/Lehre/Cpp/script/PROGRAMS/arrays-strcpy.c

    Wenn ich deren Funktion verwenden würde, würde ich nicht davon ausgehen, dass ich vorher Speicher anfordern muss, um den String kopieren zu können.

    Was ist der Unterschied zwischen text und text2?



  • manni66 schrieb:

    Phisherman schrieb:

    Ich lern zur Zeit C++ mit dem Skript vom RWTH Aachen. Von dort ist der von mir oben gepostete Code (L48): http://www.gia.rwth-aachen.de/Lehre/Cpp/script/PROGRAMS/arrays-strcpy.c

    Wenn ich deren Funktion verwenden würde, würde ich nicht davon ausgehen, dass ich vorher Speicher anfordern muss, um den String kopieren zu können.

    Was ist der Unterschied zwischen text und text2?

    Ich folgere einfach mal daraus, dass du mit darauf anspielst, dass deren Lösung nur für statische Vektoren konzipiert ist. Dann hat sich das erledigt. Danke für eure schnelle Unterstützung!



  • Ich folgere einfach mal daraus, dass du mit darauf anspielst, dass deren Lösung nur für statische Vektoren konzipiert ist.

    Nein! Die beiden Zeiger muessen auf Speicher zeigen, der dir gehoert.

    Du kannst ja auch nicht in ein fremdes Haus kacken, es muss dir gehoeren. Wenn du keins hast, dann musst du dir vorher ein kaufen. Genauso bei Speicher. Wenn du welchen brauchst, dann must du du welchen anfordern, beispielsweise mit new oder malloc .



  • Könntest du bitte konkret werden? Ich weiß sonst nicht, wo der Fehler liegt.



  • Ja, wenn Du "irgendeine Adresse" dereferenzierst, verletzt Du Speicherzugriffsrechte. Deshalb stürzt Dein Programm ab.



  • Phisherman schrieb:

    [...] ich nicht davon ausgehen, dass ich vorher Speicher anfordern muss, um den String kopieren zu können.

    Dann liegst du falsch. Wenn dich Programmieren in C++ wirklich interessiert, dann besorg dir ein schlaues Buch dazu. Beachte, dass es auch viele blöde Bücher zum Thema gibt, sowie blöde Tutorials. Vertraue auf Rezensionen von Leuten, die Ahnung haben. Sonst läufst du noch in folgende Falle. Ich finde "Accelerated C++" ja ganz toll (gibt's auch auf Deutsch, aber ich weiß nicht, ob die Übersetzung gut gelungen ist). Es ist eine kompakte Einführung in C++ auf eine "moderne Art".


Anmelden zum Antworten