char array initialisierungsproblem



  • class irgendwo
    {
     var::var(char c[])
     {   
        char varstring[]="$";
    
        strncat(varstring,c,strlen(c));
    
        cout << varstring<<endl;
     }
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        var *v=new var("a2");
    }
    //Text wird angezeigt, aber es tritt im Speicher ein Fehler auf wegen "varstring"
    

    Was ich generell nicht verstehe, wieso initialisiert er das char array varstring mit irgendwelchen werten obwohl kein new verwendet wird.

    Bei strlen liefert er zb. bei varstring[20] 27 werte, bei varstring[] 11 werte ... varstring[200] 217 werte etwas verwirrend...

    bitte um hilfe bin nicht so erfahren mit zeigern und char arrays...



  • Dieser Müll lässt sich natürlich nicht übersetzen. Wenn man ein gültiges C++-Programm draus macht, funktioniert es ohne Probleme.

    Wenn du Hilfe erwartest, solltest du wohl etwas abliefern, dass deinem Problem entspricht und statt "Text wird angezeigt, aber es tritt im Speicher ein Fehler auf wegen "varstring"" einen konkreten Fehler posten.

    Warum benutzt du nicht std::string?



  • werner_walterberg schrieb:

    bitte um hilfe bin nicht so erfahren mit zeigern und char arrays...

    Warum benutzt du sie dann?

    #include <string>
    #include <iostream>
    using namespace std;
    
    class irgendwo
    {
    public:
    	irgendwo(const string& foo_) : foo(foo_)    // falls du " : foo(foo_)" nicht kennst: Stichwort Initialisierungsliste. Ich könnte auch einfach in der Definition "foo = foo_" schreiben.
    	{
    		cout << foo << endl;
    	}
    
    private:
    	string foo;
    };
    
    int main()
    {
        // var *v=new var("a2"); // Bitte new soweit wie möglich vermeiden
    	irgendwo bar("a2");
    }
    


  • Vielleicht hilft dir das:

    char varstring[]="$"; // ist gleichbedeutend mit
    char varstring[2] = { '$', '\0' }; // char array mit 2 Werten
    

    Und Arrays kann man bekanntlich nicht vergrössern. Genau das machst du aber bei strncat (hier genau gleich unsicher wie ein strcat verwendet), du schreibst aber einen weiteren C-String (Compilerfehler bei der Parameterliste, muss wohl char *c sein) hinein. Für das ist aber kein Speicher reserviert.

    Übrigens benützt man in C++ nie <cstring>, also siehr das Ganze so aus:

    class var {
    public:
      var::var(const char *c) : foo(c)
      {  
         const char varstring[]="$";
         std::cout << varstring << c << std::endl;
      }
    private:
      std::string foo;
    };
    
    int main()
    {
        var v("a2"); // Michael E.'s Klasse müsste mit irgendwo bar(std::string("a2")); konstruiert werden, Fehler in seinem Code
    }
    


  • strstrstr schrieb:

    // Michael E.'s Klasse müsste mit irgendwo bar(std::string("a2")); konstruiert werden, Fehler in seinem Code
    

    Das geht schon, da eine implizite Konvertierung von char* nach std::string besteht (Konstruktor).

    Um es ganz genau zu nehmen, geschieht beim Aufruf sogar Folgendes... 🙂

    const char[3] -> const char* -> std::string -> const std::string&
    


  • strstrstr schrieb:

    Michael E.'s Klasse müsste mit irgendwo bar(std::string("a2")); konstruiert werden, Fehler in seinem Code
    }

    Na die Blumen geb ich mal gern zurück, denn std::string hat einen "const char*"-Konstruktor :p Dafür sieht deine Konstruktordeklaration etwas komisch aus 😉

    [Edit] Genau denselben Konstruktor benutzt du doch auch bei foo(c) 😕



  • Hmm, ich dachte bei mir wäre das irgendwann mal nicht gegangen, weil std::string(char 😉 explizit ist. Aber du hast natürlich Recht, er ist es nicht.
    Und ja, die Konstruktordeklaration ist falsch, ich hab nur werni seine kopiert und mir nicht so viel dabei gedacht.


Log in to reply