Zugriffsverletzung



  • Hallo,

    Ich habe eine eigenartige Zugriffsverletzung (sowohl bei VC 2003, als auch bei g++) bei folgende code:

    char buf[1000*sizeof(char)];
    sprintf(buf,"http://de.altavista.com/web/results?itag=wrx&q=blumen&kgs=1&kls=0&stq=0");
    

    -> Zugriffsverletzung "visualstudio/crt/src/output.c" (zeile 1135)

    Wenn ich jetzt aber z.b. "blumen" durch "bluen" oder "xblumen" ersetze, dann tritt der fehler plötzlich nicht mehr auf. gleicher passiert auch bei manchen anderen wörtern.

    Woran kann das liegen?

    grüße,



  • sprintf() übernimmt im zweiten Parameter einen Format-String und ab dem dritten die Parameter dafür. Wenn du einfach einen String in einen anderen kopieren willst benütz strcpy:

    strcpy(buf,"...");
    

    MfG SideWinder



  • Darf man mal fragen, wieso du sizeof bei der Deklaration von buf ins Spiel bringst?



  • wirkt stylischer 😃



  • @Vorden: Ist aber falsch. In seinem Fall machts keinen Unterschied, weil sizeof(char)==1. Aber stell dir folgendes Szenario vor:

    int buf [1000*sizeof(int)];
    

    Allokiert 4 Mal soviele ints wie gedacht.

    MfG SideWinder



  • Ja, is klar, aba irgendwie kommt des in Bezug auf char cooler rüber 😃

    Könntest ja immer schreiben

    int x[10000*sizeof(char)];
    

    🙂



  • Besser ist es aber, man schreibt sich für sowas ein Makro.

    #define CHAR_SIZE (1+sizeof(char)-1-sizeof(char)+1*1*sizeof(char)/1/sizeof(char))
    int x[10000*CHAR_SIZE];
    


  • würde es mit nem const int machen, da #define keine typprüfung macht, aber ansonsten ok



  • groovemaster schrieb:

    Besser ist es aber, man schreibt sich für sowas ein Makro.

    #define CHAR_SIZE (1+sizeof(char)-1-sizeof(char)+1*1*sizeof(char)/1/sizeof(char))
    int x[10000*CHAR_SIZE];
    

    Sehr umsichtiges define: Du solltest aber zusätzlich sicherstellen, daß sizeof(char) ungleich 0 ( Ziffer null == 1-1 ) ist! 🙂 (Divison durch null ist verboten )
    Außerdem bist DU dann maschinen und plattformunabahängig :p



  • groovemaster schrieb:

    Besser ist es aber, man schreibt sich für sowas ein Makro.

    #define CHAR_SIZE (1+sizeof(char)-1-sizeof(char)+1*1*sizeof(char)/1/sizeof(char))
    int x[10000*CHAR_SIZE];
    

    Poste sowas lieber nicht. Die Unerfahrenen kopieren sich das weil sie denken du meinst das ernst.



  • groovemaster schrieb:

    #define CHAR_SIZE (1+sizeof(char)-1-sizeof(char)+1*1*sizeof(char)/1/sizeof(char))
    int x[10000*CHAR_SIZE];
    

    schon ne nette idee.
    ich finde es aber eleganzer, wenn man es so ansetzt:

    #define CHAR_SIZE (sizeof(long)?sizeof(long int(&)[10])/sizeof(unsigned long(&)[10]):sizeof(short int(&)[10])/sizeof(unsigned short(&)[10]))
    

    das hat zwei riesige vorteile:
    a) mit dem ?: wird erstmal gefragt, ob sizeof(long) überhaupt ungleich 0 ist, und falls sizeof(long) tatsächlich 0 ist, wird die gleiche berechnung mit short gemacht. das ist sehr sicher, da es zur zeit keinen compiler auf dem markt gibt, wo sizeof(long) und sizeof(short) beide 0 sein.
    b) ich benutze nicht wie du fahrlässigerweise sizeof(char), um doch nur sizeof(char) auszurechnen, um einem zirkelschluss zu entgehen.



  • lol

    MfG SideWinder



  • Darf ich auch mal?

    #define CHAR_SIZE 1
    


  • FireFlow schrieb:

    Darf ich auch mal?

    #define CHAR_SIZE 1
    

    das ergibt gar keinen sinn, weil:
    a) man dann immer 1 statt CHAR_SIZE schreiben würde und CHAR_SIZE unnötig wäre.
    b) du dich auf eine zusage beziehst, die bei fehlerhaften compiler nicht immer verläßlich sein muß.



  • OK volkard, hast mich überzeugt. Deine Methode ist tatsächlich besser, und zudem eleganter.



  • ROFL 😃


Anmelden zum Antworten