Speicherzugriffsfehler

Dieses Thema im Forum "C/C++" wurde erstellt von djtraumwelt, 14.08.2010.

  1. #1 djtraumwelt, 14.08.2010
    djtraumwelt

    djtraumwelt Foren As

    Dabei seit:
    21.09.2006
    Beiträge:
    78
    Zustimmungen:
    0
    beim Aufruf von
    Code:
    sprintf(name,"Alex");
    bekomme ich einen Speicherzugriffsfehler. name wurde initialisiert am anfang der funktion mittels
    Code:
    char name[100];
    Ich bin überfragt!
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. nighT

    nighT Guest

    Ich hatte dem Letzt auch ein Problem mit "Speicherzugriffsfehler".
    Bei mir kamen diese allerdings beim compilieren eines Programms.
    Ursache war, dass der RAM voll war?! Wieso auch immer.... Nach einem Neustart des Systems war der Fehler verschwunden...

    Wobei ich bei einem "sprintf" bezweifle, dass es sooo viel RAM kostet.... Aber gib doch mal "free" ein und schau, wie viel RAM du noch frei hast...
     
  4. #3 pyropeter, 15.08.2010
    Zuletzt bearbeitet: 15.08.2010
    pyropeter

    pyropeter ..geht mit foo in die bar

    Dabei seit:
    31.08.2008
    Beiträge:
    91
    Zustimmungen:
    0
    [Wegzensiert] Du musst die Doku lesen. Dafür ist die da.

    MfG, PyroPeter

    EDIT: Und da mich grade Schuldgefühle plagen, hier der interessante Teil von printf(3):
    Tja, dann bin ich wohl ein Troll.
     
  5. #4 marcellus, 15.08.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Wenn du nicht den ganzen source und die Vorgangsweise wie dus kompilierst und ausführst postest kommen wir nirgendwo hin.
     
  6. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Stimmt, bei mir erzeugt das Programm
    Code:
    #include <stdio.h>
    int main() {
        char name[100];
        sprintf(name, "Alex");
    
        return 0;
    }
    
    keinen Speicherzugriffsfehler, egal ob ich mit gcc oder icc kompiliere, und auch valgrind gibt keine Probleme aus.
     
  7. #6 djtraumwelt, 15.08.2010
    djtraumwelt

    djtraumwelt Foren As

    Dabei seit:
    21.09.2006
    Beiträge:
    78
    Zustimmungen:
    0
    Hier der komplette Code:
    http://www.pastebin.org/514618
    Zeile 171 gibt den Speicherzugriffsfehler. Das "Sax" wird noch ausgegeben, danach schicht im schacht. Speicher ist noch 240MB frei.
     
  8. #7 marcellus, 15.08.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Ich werd jetzt einmal raten und sagen, das buffer vermutlich nicht nullterminiert ist.

    Dein Stil ist echt unangenehm zu lesen, nebenbei kannst du dir das ""%s"," im sprintf sparen und ich denk amal, wenn du snprintf mit einer längenbeschränkung reingeben würdest würds dir vermutlich nicht segfaulten, aber es stünde ein riesen haufen mist in deinem user name.

    Du solltest dich aber langsam in einen debugger einlesen, schau dir gdb, ddd und nemiver an.
     
  9. #8 djtraumwelt, 15.08.2010
    djtraumwelt

    djtraumwelt Foren As

    Dabei seit:
    21.09.2006
    Beiträge:
    78
    Zustimmungen:
    0
    Code:
                    } else if (buffer[0]=='N') {
                        printf("%s",buffer);
    
    gibt ebenfalls einen Speicherzugriffsfehler. Scheinbar habe ich innerhalb des ifs keine weitere berechtigung aus buffer zu lesen. komisch nur dass es bei password einwandfrei funktioniert.
     
  10. #9 marcellus, 15.08.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    printf gibt bei "%s" alles bis zum nächsten '\0' aus, wenn du einen nicht nullterminierten string hast liest er über die grenzen von buffer hinaus bis der kernel ihm auf die finger haut und ihn mit einem segfault abschießt, oder er doch irgendwo eine '\0' findet, das wär aber reiner zufall.
     
  11. #10 djtraumwelt, 15.08.2010
    djtraumwelt

    djtraumwelt Foren As

    Dabei seit:
    21.09.2006
    Beiträge:
    78
    Zustimmungen:
    0
    das programm springt erst an diese stelle, wenn er in der for schleife ein \n findet, welches er sofort in 0 wandelt. die ausgabe von
    Code:
    printf("servfunc: ID %d received: %s\r\n",id,buffer);
    funktioniert fehlerfrei und ein paar zeilen später dann der segfault mit dem fast gleichen printf
     
  12. #11 marcellus, 16.08.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    meinst du
    Code:
    [I]buffer[n]=[B]0[/B];[/I]
    printf("servfunc: ID %d received: %s\r\n",id,buffer);
    Wenn du einen Teil von buffer auf 0 setzt ist es auch 0 terminiert, wenn bei dir nicht "if (buffer[n]=='\n')" ist setzt du buffer[n] auch nicht auf 0 und deswegen ist buffer in dem fall auch nicht 0 terminiert.
     
  13. #12 djtraumwelt, 16.08.2010
    djtraumwelt

    djtraumwelt Foren As

    Dabei seit:
    21.09.2006
    Beiträge:
    78
    Zustimmungen:
    0
    wenn "if (buffer[n]=='\n')" nicht ist, dann springt er gar nicht an die stelle, wo auf buffer zugegriffen wird. es ist also unmöglich, dass er den code ausführt während buffer nicht nullterminiert ist.
     
  14. #13 marcellus, 16.08.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Natürlich, wenn buffer[0]=='N' dann werden die '\n' gar nicht ersetzt vorm ausführen.
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 bytepool, 17.08.2010
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    ich hab grad mal in den Code reingeschnuppert, die Formatierung ist ja wirklich fuerchterlich. Formatierung ist bekanntlich Geschmacksache, aber der Code ist voellig unleserlich.

    Code:
    for (; n < trc; n++) if (buffer[n]=='\n') {
    
    Das ist eins der abscheulichsten Dinge die ich jemals in freier Wildbahn gesehen habe, ich dachte solche Konstrukte gaebe es nur in Texten zu schlechtem Stil...

    Du tust dir und anderen sicherlich einen Gefallen wenn du dir mal ein paar Stilrichtlinien durchliest und zu eigen machst. Optimalerweise benutzt man dann noch einen Editor der die Formatierung automatisiert, in Eclipse z.B. mit ctrl-shift-F zu erreichen. Die Chance ist gross dass du dadurch automatisch zu einem besseren Programmierer wirst, mal davon abgesehen dass du leichter und schneller Hilfe bekommst.

    Wie marcellus ja schon sagte, duerftest du den Fehlern mit einem Debugger am schnellsten auf die Schliche kommen, gerade protection faults wegen fehlender '\0' sind so leicht gefunden.

    mfg,
    bytepool
     
  17. #15 djtraumwelt, 22.08.2010
    djtraumwelt

    djtraumwelt Foren As

    Dabei seit:
    21.09.2006
    Beiträge:
    78
    Zustimmungen:
    0
    marcellus: die abfrage ob buffer[0] == 'N' ist, ist innerhalb des if (buffer[n]=='\n') gefolgt von einem buffer[n]=0

    bytepool: hast du links zu "guter stil mit c", "stilrichtlinien in c" oder dergleichen? dann les ich mir alles durch und versuche mit einem guten stil das ganze programm nochmal komplett neu zu schreiben.
     
Thema: Speicherzugriffsfehler
Besucher kamen mit folgenden Suchen
  1. speicherzugriffsfehler

    ,
  2. ursachen für speicherzugriffsfehler linux

    ,
  3. fprintf gcc speicherzugriffsfehler

    ,
  4. speicherzugriffsfehler gcc
Die Seite wird geladen...

Speicherzugriffsfehler - Ähnliche Themen

  1. [C] Speicherzugriffsfehler mit malloc

    [C] Speicherzugriffsfehler mit malloc: [Erledigt] [C] Speicherzugriffsfehler mit malloc Bei dem folgendem Script, bekomme ich immer bei der Zahl "33789" einen Speicherzugriffsfehler....
  2. ClamAV meldet Speicherzugriffsfehler

    ClamAV meldet Speicherzugriffsfehler: Hi, mein ClamAV will nicht starten: # /etc/init.d/dansguardian start Starting DansGuardian: dansguardianLibClamAV Warning:...
  3. Dansguardian bringt Speicherzugriffsfehler

    Dansguardian bringt Speicherzugriffsfehler: Wenn ich Dansguardian starten will, mekkert er: Starting DansGuardian: dansguardianLibClamAV Warning:...
  4. apt-get Speicherzugriffsfehler

    apt-get Speicherzugriffsfehler: Hallo, habe ein Debian System neu augesetzt und habe anschließend mit apt-get install ssh den SSH-Server installiert. Nun wollte ich weitere...
  5. Speicherzugriffsfehler; vertauscht hde/hda; debian

    Speicherzugriffsfehler; vertauscht hde/hda; debian: Hallo Ich habe ein Seltsames Problem mit meinem Desktop PC: Da ich mir ein Notebook zugelegt Habe benutze ich meinen Desktop PC nicht mehr...