segmantation fault unter linux



  • Guten Abend!
    Ich habe das Problem, dass ich wenn ich mein Programm unter linux ausführe mittendrin ein segmentaion fault als fehlermeldung bekomme. Ich weiß wirklich woran das liegen könnte. Vorallem weil die Funktion, die nur mit einem pointer läuft, eigentlich läuft. Wenn ich sie jedoch in mein hauptprogramm einbette und sie von der main aufrufe und ein string übergebe ständig diese Fehlermeldung kommt. Ist das normal oder könnte das an meinem computer liegen?



  • seg faults sind "speicherzugriffsfehler".

    das passiert nur bei pointern. (arrays sind z.B. pointer)

    d.h., dass er auf einen ort in dem arbeitsspeicher von deinem pc zugreifen möchte, worauf er keinen zugriff hat.

    z.B.:

    char array[5];
    array[10] = 'a'  // <- seg. fault, das array hat nur 5 bytes reserviert
    

    kuck also mal deinen code durch, überall wo du ein array, oder explizitin pointer verwendest, könnte der fehler sein.

    hau mal hinter jede solche anweisugn, die damit etwas zu tun hat, ein

    printf("OK.\n");
    

    dann führ das prog aus, und du wirst sehen, wo er hängen geblieben ist.

    dort greifst du dann auf einen ort zu, der den rahmen eines arrays sprengt, oder wofür du noch kein speicher alloziiert hast (-> malloc() )

    mfg



  • versuch mal das programm mit strace zu starten

    $ strace ./programm
    

    oder schau mal mit einen debugger (gdb) wo der fehler liegt wenn du ihn nicht gleich durch codelesen findest

    $ gdb
    (gdb) run ./programm
    


  • hmm ich sehe das problem. Ich habe wirklich einzig und allein ein Pointer in meinem programm und das problem liegt wirklich bei diesem pointer.

    [code] ptoken*char;
    ptoken = (char 😉 malloc (sizeof(char));
    [code]
    Hier habe ich ptoken deklariert.

    und malloc benutzt. Später benutze ich dann ptoken:
    [code]ptoken=strtok(string,"+*-/");

    Hier tritt dann der Fehler auf!
    Was kann ich denn noch machen damit der fehler nicht auftritt??



  • hdi schrieb:

    (arrays sind z.B. pointer)

    stimmt nicht!
    🙂



  • Du reservierst ja nur für ein Zeichen Speicher.
    Und für den Rückgabewert von strtok() brauchst du keinen Speicher reservieren, nur für den zu parsenden String.

    char string = malloc(N*sizeof(char)); // kein cast beim malloc (in C)
    char *ptoken;
    
    // Eingabe von string z.B. aus einer Datei
    
    ptoken = strtok(string,"+*-/");
    
    free(string);
    


  • hmm aber auch so tritt wieder der fehler auf


Anmelden zum Antworten