Segmentation fault - kleiner code!



  • Hallo!
    Habe ein Problem was bei Debian System auftauche (auf SuSe klappt es)

    Folgendes:

    void sending::sendto(int fd,char ch[1024])
    {
      int len=strlen(ch);   // HIER
      ch[len]='\0'; len++;  // ODER HIER - Stürtz das Programm ab!
    
      write(fd,ch,len+1);
    }
    // Wert von ch = "OK" !
    // Fehler: "Segmentation fault"
    

    Kann mir einer Helfen oder Tipps geben??



  • hö, du benutzt eine Funktion, die eine Nullterminierung des Strings erwartet (man: strlen(3)) auf einen String der nicht Nullterminiert ist, um diesen dann mit Null zu terminieren? Wo ist da der Sinn? Und wozu addierst du 2 zu der länge?

    Kein Wunder, dass das nicht geht.

    warum übergibst du den String mit konstanter Länge?

    void sending::sendto(itn fd,const char *ch)
    

    Und wenn strlen size_t zurückgibt, ist es sicher Sinnvoll die Länge in einer size_t und nicht in einer Integer Variable zu speichern 🙄



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Linux/Unix in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • OK danke!
    Ich habe es nun so gemacht und es kommt kein fehler... leider ist es aber auch nicht das was ich wollte! Denn bei write wird der NULL byte nicht mitgesendet! Das muss aber unbedingt sein.. Alle Versuche ein NULL Byte dran zu hängen (strcut) oder die länge einfache +1 scheitern mit den selben fehler wie oben.

    void sending::sendto(int fd,const char *ch)
    {
      printf("sende: %s\n",ch);
      int len=strlen(ch);  
      write(fd,ch,len);
    }
    


  • Also wenn du ein Byte mit dem Wert 0 in eine Datei schreiben willst, dann wirst du wohl eine Binärdatei haben, oder?? Ansonsten macht es nämlich nicht viel Sinn.



  • Sicher, dass die 0 nicht mitgesendet wird, wenn du len um 1 erhöst? Ansonsten ist es ja auch kein großes Problem die Nullterminierung bei read vorzunehmen

    ssize_t n=read(fd,buffer,length-1);
    if(n!=-1)
      buffer[n+1]=0;
    

    aber jetzt ist das Problem doch kein ANSI C Problem mehr und es kann wieder zurück verschoben werden...

    btw. schau dir mal die Definition von man: strlen(3) und von man: write(2) an. Beide erwarten size_t; denkst du wirklich, dass du int und nicht lieber size_t nehmen solltest 🙄

    @AJ
    Binär gibt es nicht unter Unix :). Außerdem sieht das mehr nach schreiben aus.



  • @kingruedi
    Hätte ja sein können :).

    Soll ich den Beitrag jetzt wieder zurück ins Linux-Forum schieben?



  • Hallo

    Das ganze ist ne Chatserver.. und der Client erwartet halt eine "\0" am ende.
    Werde es wohl mit 2 write befehlen lösen müssen... in mein C++ Buch steht strlen = int. hm...

    Tja ich werd wohl verschiedende sachen versuchen müssen...



  • Was macht dieser Beitrag im "ANSI C" Forum?

    Das ist doch eigendlich C++!!!

    //sending::sendto
    //write

    oder?



  • Ist halt ein übergreifendes Thema...



  • @chille
    Dass die Funktionen innerhalb einer Methode einer Klasse aufgerufen werden, ist beim Problem an sich wohl eher Nebensache ;). write() ist zwar kein ANSI-C Standard, aber dennoch C und nicht C++.



  • Mein Fehler besteht immer noch..

    void sending::sendto(int fd,const char *ch)
    {
    if(DEBUGMODE) printf("sende: %s",ch);

    write(fd,ch,strlen(ch));
    }

    Er gibt den richtigen text aus, aber bei write kommt dann sofort der fehler... (segmentation fault) Es ist ja nix falsch daran... gibt es vielleicht eine Alternative zu write die ich mal versuchen könnte?



  • so kann man keinen Fehler erkennen, hast du mal mit dem Debugger geguckt?

    chille07 schrieb:

    Das ist doch eigendlich C++!!!

    Ne, dass ist mehr C mit Klassen 🙂


Anmelden zum Antworten