Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » const char* x überschreibt const char* y

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.02.2011, 15:01 Uhr
mentizm



Hallo Forum,

ich hoffe ichr könnt mir helfen und mir das problem erklären was ich hier habe. Ich komme da nicht drauf was ich falsch mache.


C++:
    const char* c_ang = NULL;
    stringstream ang;
        int angle = 50;
    ang << angle;
    c_ang = ang.str().c_str();

    const char* c_dis = NULL;
    stringstream dis;
        int distance = 60;
    dis << distance;
    c_dis = dis.str().c_str();

    const char* good = NULL;
    float f = 0.731;
    stringstream s;
    s << f;
    good = s.str().c_str();



nun erwarte ich bei cout << c_ang << c_dis << good;
die ausgabe: 50 60 0.731
doch die ausgabe lautet: 0.731 0.731 0.731

alle vorher initialisierten CONST CHAR* haben nun den wert des letzten CONST CHAR*

ich komme an dieser stelle nicht mehr weiter und kann mir das nicht erklären, da die variabelen ja unterscheidlich benannt sind. was passiert hier? kann ein CONST CHAR* nur einmal zur verfügung gestellt werden. so wie ich das verstehe ist dies ja ein ARRAY aus chars oder nicht?

danke schonmal an jeden, der mir das erklären kann!
gruß mentizm

Dieser Post wurde am 01.02.2011 um 18:31 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.02.2011, 18:30 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi


Zitat:

The returned array points to an internal location with the required storage space for this sequence of characters plus its terminating null-character, but the values in this array should not be modified in the program and are only granted to remain unchanged until the next call to a non-constant member function of the string object.



theoretisch könnte man davon ausgehen, das es PRO objekt ist - anscheinend tut dein compiler dies aber wohl PRO programm zu tun. - wohl intern keine thread-sichere implementierung von string (bzw stringstream) ;-)

ansonsten benutz doch die c_str() methode erst gaaaaanz zu letzt - also so spät wie möglich und arbeite ansonsten auf deinen string-objekten.
--
class God : public ChuckNorris { };

Dieser Post wurde am 01.02.2011 um 18:33 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.02.2011, 19:41 Uhr
TOSHMAX



FloSoft hat Recht, du solltest den Pointer von c_str() wirklich nicht speichern, obwohl ich nicht verstehe, warum die das nicht ändern!

Aber das Problem, das du hast, tritt auf, weil std::stringstream.str() einen std::string "per value" zurückgibt und nicht "per reference". Das heißt, nachdem der Aufruf beendet ist, wird das string-Objekt zerstört und damit auch sein Inhalt.
Das du 3-mal den selben Pointer erhältst ist reiner Zufall, das Programm könnte genauso gut abschmieren!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.02.2011, 22:43 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wär mal interessant mit nem memory-debugger zu schaun was an den stellen da so im stack liegt
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.02.2011, 07:57 Uhr
Tommix



'Morgen,
der Fehler liegt hier:

C++:
c_ang = ang.str().c_str();



Zitat:

basic_stringstream::str
Return Value
Returns an object of class basic_string< Elem, Tr, Alloc>, whose controlled sequence is a copy (sic!) of the sequence controlled by *this.


Da der string bei Dir nur temporär ist, ist der kopierte Puffer nach der Zeile wieder dahin.
So gehts:

C++:
    const char* c_ang = NULL;
    stringstream ang;
    int angle = 50;
    ang << angle;
    string s1 = ang.str();
    c_ang = s1.c_str();

    const char* c_dis = NULL;
    stringstream dis;
    int distance = 60;
    dis << distance;
    string s2 = dis.str();
    c_dis = s2.c_str();



usw.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.02.2011, 12:04 Uhr
mentizm



Also erstmal vielen Dank für den schnellen suport! Und TOMMIX: Deine Lösung funzt einwandfrei.

Aber ich verstehe nur Bahnhof in bezug auf den kopierten Buffer, der nach der Zeile wieder dahin ist.

Verstanden habe ich, dass das Problem nicht am CONST CHAR* lag sondern der STRINGSTREAM mir Probleme gemacht hat.


C++:
    const char* c_ang = NULL;
    stringstream ang;
    int angle = 50;
    ang << angle;
    // Also gehe ich mal davon aus, dass der Fehler hier liegen muss
    c_ang = ang.str().c_str();



also das ANG.STR() bildet nur eine Kopie, welche C_STR() in einen CONST CHAR* wandelt?

Aber da ja C++ sequenzell arbeitet wundert es mich, dass wenn ich c_ang einen Wert übergebe, dieser später geändert wird, obwohl ja an c_ang kein anderer Wert mehr übergeben wird.

Weil c_ang bildet doch keine Refrenz auf STRINGSTREAM, dass somit später STRINGSTREAM übergeben werden?

nochmal!
mentizm

Dieser Post wurde am 02.02.2011 um 16:46 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.02.2011, 12:26 Uhr
Tommix



Die vermeindliche Änderung ist schlicht undefiniertes Verhalten. stringstream::str erzeugt ein neues string-objekt, dieses enthält einen Puffer, dessen Adresse man mit c_str abfragen kann. Da Du diesen string aber keiner Variablen zugewiesen hast, wird er sofort wieder zerstört und der eben noch gültige Puffer kann anderweitig verwendet werden.
Es ist ein bisschen schwierig zu erklären, der Ablauf ist in etwa wie hier:

C++:
char const* ptr;
{
    string s = "Hallo";
    ptr = s.c_str();
}   // hier wird ~s aufgerufen, ptr wird ungültig
cout << ptr;  // Verhalten undefiniert



- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.02.2011, 13:28 Uhr
mentizm



also ich finde ja c++ sowieso n bisschen tricky. da muss man lange investieren um alles zu verstehen, aber dieses problem ist mir dank dir etwas klarer geworden. ich weiß womit du darauf hinaus willst.

danke nochmal!

von mir aus ... da das problem gut gelöst wurde!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: