Sinatra: Fehlerhafter C++ Code

Hallo,

warum funktioniert folgender Code nicht?

  
 char* request = NULL;  
 char buffer[] = {"Hallo World!"};  
 char* p = NULL;  
  
 p = request;  
 p += strlen(request);  
 for(unsigned short i = 0; i < strlen(buffer); i++) {  
  *p = buffer[i];  
   p++;  
 }  
 *p = '\0';  
 printf("%s", request);  

Meiner bescheidenen Meinung nach müsste der Code funktionieren, was er aber nicht tut. Wiso nicht?

Sinatra

  1. Hallo,

    1 P:\devCPP\quelltexte\cpp\selfhtml.cpp `NULL' was not declared in this scope

    ... ist die erste von 12 Fehlermeldungen in dev-cpp. Vergessen, was zu includen?

    Gruß, Nils

    --
    Es gibt keine Lösung, weil es kein Problem gibt. (Duchamp)
    1. 1 P:\devCPP\quelltexte\cpp\selfhtml.cpp `NULL' was not declared in this scope
      ... ist die erste von 12 Fehlermeldungen in dev-cpp. Vergessen, was zu includen?

      Nein, der Code wird ohne Fehler und Warnung übersetzt.
      Vielleicht sollte ich noch erwähnen das ich mit GNU/Linux arbeite.

      Sinatra

  2. Hallo Sinatra,

    warum funktioniert folgender Code nicht?

    was erwartest Du, was passiert?
    Kommentare wären übrigens auch ganz nett - vor allem bei Anfängercode.

    char* request = NULL;
    char buffer[] = {"Hallo World!"}; // wozu die geschweiften Klammern?

    // nicht falsch, aber überflüssig.

    char* p = NULL;

    p = request;                      // Hmm, keine Änderung

    // p enthält immer noch einen Nullzeiger

    p += strlen(request);             // Hier erzeugst Du einen Laufzeitfehler ...

    for(unsigned short i = 0; i < strlen(buffer); i++) {
      *p = buffer[i];
       p++;
    }
    *p = '\0';
    printf("%s", request);

    
    >   
    > Meiner bescheidenen Meinung nach müsste der Code funktionieren,  
      
    Meiner Meinung nach dürfte der Code einen Laufzeitfehler produzieren. Unter DOS gäbe es anschließend einen Rechnerneustart. Was für ein Glück, dass die Zeiten sich geändert haben.  
      
    Wenn Du eine Zeichenkette kopieren möchtest, dann solltest Du die dazu vorgesehenen Funktionen von C nutzen. Unter C++ solltest Du sowieso zur String-Klasse greifen :-)  
      
    Bitte beschreibe daher, was Dein Code bewirken soll - und was er bewirkt.  
    Was haben Deine Debug-Versuche ergeben?  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
  3. Hallo Sinatra.

    Warum stellst du diese Frage zu C++, wo du nur ein einziges Feature davon nutzt? Der Rest deines Codes ist blankes C.

    warum funktioniert folgender Code nicht?

    char* request = NULL;
    char buffer[] = {"Hallo World!"};
    char* p = NULL;

    p = request;
    p += strlen(request);
    for(unsigned short i = 0; i < strlen(buffer); i++) {
      *p = buffer[i];
       p++;
    }
    *p = '\0';
    printf("%s", request);

    
    >   
    > Meiner bescheidenen Meinung nach müsste der Code funktionieren, was er aber nicht tut. Wiso nicht?  
      
    Weil du noch nicht gelernt hast, vernünftig zu debuggen. Als erstes kompilierst du deinen Quellcode erneut, diesmal übergibst du dem Compiler aber noch die Option „-g“. Damit werden Debugging-Symbole in deine Applikation eingebunden.  
      
    Als nächstes rufst du den „gdb“ mit dem deiner Applikation als Argument auf. Befindet sie sich im aktuellen Verzeichnis, dann wie gewohnt per „./app“.  
      
    Nun startest du die Ausführung mittels „run“ und erhältst deine Lösung:  
      
    (gdb) run  
    Starting program: /home/ashura/test  
    Failed to read a valid object file image from memory.  
      
    Program received signal SIGSEGV, Segmentation fault.  
    0x080484b0 in main () at test.c:12  
    12       p += strlen(request);  
    Current language:  auto; currently c++  
      
    Und in der Tat: welche Länge soll NULL deiner Meinung nach haben?  
      
      
    Einen schönen Sonntag noch.  
      
    Gruß, Mathias  
    
    -- 
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)  
      
    debian/rules
    
  4. Hi,

    warum funktioniert folgender Code nicht?

    was heißt das genau? Denn "funktioniert nicht" funktioniert nicht. Beschreibe doch bitte mal, ws dieser Codeausschnitt überhaupt tun soll. Für mich sieht da jedenfalls einiges verdächtig aus.

    char* request = NULL;
    char buffer[] = {"Hallo World!"};
    char* p = NULL;

    p = request;

    An dieser Stelle ist p also immer noch NULL, weil request ja ebenfalls NULL war. Warum hast du p dann überhaupt gleich bei der Deklaration initialisiert? Nur der Ordnung halber? Okay, akzeptiert.

    p += strlen(request);

    Autsch. Was macht strlen(), wenn das übergebene Argument NULL ist? Eigentlich sollte dieser Fehlerfall berücksichtigt sein; dann würde ich erwarten, dass strlen() den numerischen Wert 0 liefert. Dann wäre p nach dieser Zeile aber immer noch NULL (denn NULL+0 = NULL).
    Es kann aber auch sein, dass dieser Aufruf bereits eine Speicherschutzverletzung darstellt - dann nämlich, wenn strlen() stur versucht, die Länge des ab Adresse 0 (NULL) abgelegten Strings zu bestimmen.

    for(unsigned short i = 0; i < strlen(buffer); i++) {
      *p = buffer[i];

    und spätestens hier knallt's, weil du versuchst, den NULL-Zeiger p zu dereferenzieren und die resultierenden Adresse 0 zu beschreiben.

    Meiner bescheidenen Meinung nach müsste der Code funktionieren, was er aber nicht tut.

    Meiner bescheidenen Meinung nach _kann_ dieser Code nicht funktionieren[*].

    So long,
     Martin

    [*] funktionieren: Hier "ohne Fehler durchlaufen und ein sinnvolles Ergebnis liefern".

    --
    "Drogen machen gleichgültig."
     - "Na und? Mir doch egal."