Bad Pointer nach sprintf



  • Hallo,
    ich habe folgende Klasse:

    class Test
    {
    public:
    	Test(void);
    	Test(char* str);
    	~Test(void);
    	void getTo(char &res);
    
    private:
    	char* from;
    	char* to;	
    };
    

    im Konstruktor Test(char* str) wird str zerlegt und die variablen from und to gefüllt. Das mache ich so:

    Test::Test(char* str)
    {
    	from = new char();
    	to = new char();
    	memcpy(from, "test", 4);	
    	from[4]='\0';
    	memcpy(to, "testxyz", 7);
       to[7]='\0';
    }
    

    in der Methode getTo(char &res) soll dann "To: " und der Wert von to auf res geschrieben werden.

    void Test::getTo(char &res)
    {
    
    	sprintf(&res, "To: %s", to)
    }
    

    in res dann auch das was ich will allerdings ist to dann ein Bad Pointer.
    Ich möchte to aber noch in anderen Methoden der Klasse verwenden.
    Kann mir jemand sagen wo ich einen Fehler mache??
    Wenn ich

    to = new char();
    

    im Konstruktor weglasse gehts nicht.



  • Die Array-Syntax heisst ja auch new char[] und in den eckigen Klammern musst Du die Anzahl der zu reservierenden Zeichen angeben. Vorsicht: Du brauchst eins mehr als die Stringlänge, wegen der Nullterminierung.

    Darüberhinaus übergibst Du der Funktion GetTo eine Referenz auf ein Zeichen, war das beabsichtigt? Jedenfalls dürfte der Schreibvorgang dann ziemlich schiefgehen. Wenn Du bei C-Strings bleiben willst, musst Du der Methode GetTo einen Zeiger auf ein Char-Array liefern (wie Du es mit new char[] erzeugt hast).

    Andere Frage: Warum nutzt Du dafür nicht std::string?



  • ich übergebe getTo eine Referenz auf ein char-array. Das habe ich vorher mit new char[] erzeugt.
    Was muss ich machen wenn ich beim erzeugen der Arrays die Größe nicht weiss??
    Ich hab zwar in diesem Fall "test" bzw. "testxyz" reingeschrieben, aber das soll aus einer Datei gelesen werden und dann kann es beliebig lang sein.

    Hab jetzt mal new char() in new char[] geändert. Hab aber dann immernoch danach einen bad pointer.



  • nala schrieb:

    ich übergebe getTo eine Referenz auf ein char-array....

    Sorry, Zeiger mein ich



  • Falls du weiterhin char nutzen willst:

    Test::Test(const char* ptr)
    {
        std::size_t len = std::strlen(ptr) / 2 + 1;
        m_from = new char[len];
        std::strncpy(m_from, ptr, len - 1);
        len = std::strlen(ptr) - (len - 1) > len ? len + 1 : len;
        m_to = new char[len];
        std::strncpy(m_to, &ptr[len], len - 1);
    }
    
    Test::~Test()
    {
        delete [] m_to;
        delete [] m_from;
    }
    

    ...



  • also nur mit char[] anlegen geht nicht, da eben die größe des arrays fehlt...

    in deiner getToübergibst du eine referenz, dann kannst (mußt?) du das "&" beim verwenden weglassen.

    wieso nimmst du keinen string? macht das um einiges leichter ^^



  • Hi,

    ich unterstütze:

    LordJaxom schrieb:

    ...Andere Frage: Warum nutzt Du dafür nicht std::string?

    qwer123 schrieb:

    ...
    wieso nimmst du keinen string? macht das um einiges leichter ^^

    Dann würde aus Deinem Code:

    class Test
    {
    public:
       Test();
       Test(string const& s) {	from = "test";	to = "testxyz"; }
    	// Alternativ mit "Initialisierungsliste" : Test(string const& s) : from("test"), to("testxy") {}
    	string getTo() { return string("To: ") + to; }
       // Destruktor brauchst Du gar nicht
    private:
    	string from, to;
    };
    

    Ist doch wohl kürzer, sicherer, einfacher, .... 😃

    Ach ja: Du schreibst:

    nala schrieb:

    im Konstruktor Test(char* str) wird str zerlegt und die variablen from und to gefüllt.

    Davon sehe ich in Deinem Code nichts....

    Gruß,

    Simon2.


Anmelden zum Antworten