kostenloser Webspace werbefrei: lima-city


segfault bei Rückgabe von char*

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    m******s

    Moin,

    also, zur Vorwahrnung: Ich bin nicht sehr erfahren in C++ ;)

    Bin gerade dabei, was zusammenzuschreiben und muss dafür eine Datei in einen String laden. Allerdings kommt biem Aufruf immer ein Segfault:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    char* getSearchString()
    {
            ifstream orgfile("file");
            orgfile.seekg(0, ios::end);
            unsigned int length = orgfile.tellg();
            char* result = new char(length + 1);
            orgfile.seekg(0, ios::beg);
            orgfile.read(result, length);
            result[length] = '\0';
            return result; // segmentation fault!
    }
    
    int main()
    {
            char* foo = getSearchString();
            return 0;
    }


    Der Fehler tritt definitiv bei der Rückgabe von result auf (direkt davor nen cout wird ausgeführt, direkt danach (in main) nicht mehr).
    Also, ich hab absolut keine Ahnung wo da das Problem liegt. Wäre nett, wenn mir jemand nen hint geben könnte ;)

    Beitrag zuletzt geändert: 29.1.2009 22:12:40 von merovius
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. kochmarkus

    Co-Admin Kostenloser Webspace von kochmarkus

    kochmarkus hat kostenlosen Webspace.

    Das Problem ist, das die Funktion getSearchString einen Zeiger auf eine char Variable zurück gibt. Diese Variable existiert jedoch nur in der Funktion getSearchString und wird beim verlassen der Funktion gelöscht. Bei der Zuweisung char* foo = getSearchString(); kommt es dann zum Zugriff auf einen Speicherbereich der nicht mehr gültig ist => SEGFAULT

    Du könntest das ganze entweder mit strings anstatt mit char* machen, oder du übergibst der Funktion getSearchString ein char* als Parameter, in dem das Ergebnis gespeichert wird.
  4. c*****s

    Das Problem ist, das die Funktion getSearchString einen Zeiger auf eine char Variable zurück gibt. Diese Variable existiert jedoch nur in der Funktion getSearchString und wird beim verlassen der Funktion gelöscht. Bei der Zuweisung char* foo = getSearchString(); kommt es dann zum Zugriff auf einen Speicherbereich der nicht mehr gültig ist => SEGFAULT
    Mit new legst du was auf den Heap und nicht auf den Stack, die Gültigkeit des Pointers bleibt daher nicht auf die Funktion beschränkt.
    Der Fehler tritt definitiv bei der Rückgabe von result auf (direkt davor nen cout wird ausgeführt, direkt danach (in main) nicht mehr).
    ich bekomme genauso einen Fehler, wenn ich den Inhalt von getSearchString() gleich in main() ausführen lasse :confused:

    Also meiner Ansicht nach liegt es daran, dass du bei char* result = new char(length + 1);
    runde Klammern statt eckiger benutzt hast. Damit allozierst du ein Array von einem Byte und initialisierst es mit dem Wert von length+1.

    Beitrag zuletzt geändert: 29.1.2009 23:46:44 von calexus
  5. Autor dieses Themas

    m******s

    Hm, dann hab ich aber irgendetwas ganz furchtbar missverstanden (was fatal wäre, denn ich schreib da am Montag ne Klausur drüber ^^). Soweit ich das verstanden habe, wird doch mit "new" ein Speicherbereich angefordert, der erst wieder frei wird, wenn man ihn mit "delete" freigibt, oder etwa nicht?

    Okay, aber es spricht natürlich für diene Theorie, dass er sich erst ab einer bestimmten Länge beschwert, bei einer sehr kurzen Datei passiert nichts....

    Also meiner Ansicht nach liegt es daran, dass du bei char* result = new char(length + 1);
    runde Klammern statt eckiger benutzt hast. Damit allozierst du ein Array von einem Byte und initialisierst es mit dem Wert von length+1.


    Ach fuck ^^ Ich dachte halt, dass man in runden Klammern angibt, wie viele Einheiten allokiert werden sollen ^^

    Das hat man davon, wenn man nicht einmal kurz in die Dokumentation schaut, wenn man sich ob der Syntax unsicher ist.

    Also dankeschön, Problem gelöst ^^

    Beitrag zuletzt geändert: 29.1.2009 23:54:57 von merovius
  6. c*****s

    merovius schrieb:
    Hm, dann hab ich aber irgendetwas ganz furchtbar missverstanden (was fatal wäre, denn ich schreib da am Montag ne Klausur drüber ^^). Soweit ich das verstanden habe, wird doch mit "new" ein Speicherbereich angefordert, der erst wieder frei wird, wenn man ihn mit "delete" freigibt, oder etwa nicht?

    Okay, aber es spricht natürlich für diene Theorie, dass er sich erst ab einer bestimmten Länge beschwert, bei einer sehr kurzen Datei passiert nichts....
    du hast es schon richtig verstanden. Mit new landet das Objekt auf dem Heap und bleibt dort bis es mit delete gelöscht wird. Bei einem statischen Array, innerhalb einer Funktion definiert, wäre das anders, da es auf den Stack kommt.

    Da du bis auf das eine Byte gar keinen Speicherplatz reserviert hast, kommt es beim Schreiben in den Speicher früher oder später zum Crash. Wenn die Datei sehr klein ist, kann man halt Glück haben ;-)
  7. kochmarkus

    Co-Admin Kostenloser Webspace von kochmarkus

    kochmarkus hat kostenlosen Webspace.

    Achja, um die Uhrzeit kann man so ein kleines new schonmal übersehen. Aber calexus hat mit seiner Erklärung absolut recht. Allerdings solltest du, wenn du mit new Speicher allozierst ihn irgendwann auch wieder mit delete freigeben, oder bei einem Array mit delete [].
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!