<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[c_str() kaputt.]]></title><description><![CDATA[<pre><code class="language-cpp">char* pw = MimiEdit-&gt;Text.c_str();
char* value = Edit1-&gt;Text.c_str();
MessageBoxA(Handle, pw, &quot;&quot;, 0);
MessageBoxA(Handle, value, &quot;&quot;, 0);
</code></pre>
<p>Es stehen auf jeden Fall unterschiedliche Werte in den beiden Feldern, trotzdem wird beide Male das Angezeigt was in Edit1 steht. Wenn ich jetzt allen Text aus Edit1 lösche funktionierts...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/174670/c_str-kaputt</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 20:14:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/174670.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Mar 2007 19:25:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to c_str() kaputt. on Thu, 01 Mar 2007 19:25:33 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">char* pw = MimiEdit-&gt;Text.c_str();
char* value = Edit1-&gt;Text.c_str();
MessageBoxA(Handle, pw, &quot;&quot;, 0);
MessageBoxA(Handle, value, &quot;&quot;, 0);
</code></pre>
<p>Es stehen auf jeden Fall unterschiedliche Werte in den beiden Feldern, trotzdem wird beide Male das Angezeigt was in Edit1 steht. Wenn ich jetzt allen Text aus Edit1 lösche funktionierts...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237694</guid><dc:creator><![CDATA[Toniiii]]></dc:creator><pubDate>Thu, 01 Mar 2007 19:25:33 GMT</pubDate></item><item><title><![CDATA[Reply to c_str() kaputt. on Thu, 01 Mar 2007 19:33:57 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>du hast auch 4 Parameter in MessageBoxA übergeben?!</p>
<pre><code class="language-cpp">Application-&gt;MessageBoxA(&quot;titel&quot;, &quot;value&quot;, 0);
</code></pre>
<p>mfg, Micha</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237701</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 01 Mar 2007 19:33:57 GMT</pubDate></item><item><title><![CDATA[Reply to c_str() kaputt. on Thu, 01 Mar 2007 20:18:22 GMT]]></title><description><![CDATA[<p>RandomAccess85 schrieb:</p>
<blockquote>
<p>du hast auch 4 Parameter in MessageBoxA übergeben?!</p>
</blockquote>
<p>Das ist auch völlig richtig so. Vielleicht ist dir aufgefallen, daß er nicht &quot;Application-&gt;&quot; davorgeschrieben hat, und daß er sich über seltsames Laufzeitverhalten beklagt, was voraussetzt, daß der Compiler seinen Code ohne Syntaxfehler übersetzt hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Zum Thema:<br />
Das Verhalten hängt damit zusammen, wie das Property TControl::Text den Fenstertext ermittelt. Dem VCL-Quelltext zufolge geschieht das folgendermaßen:</p>
<pre><code>function TControl.GetTextBuf(Buffer: PChar; BufSize: Integer): Integer;
begin
  Result := Perform(WM_GETTEXT, BufSize, Longint(Buffer));
end;
...
function TControl.GetTextLen: Integer;
begin
  Result := Perform(WM_GETTEXTLENGTH, 0, 0);
end;
...
function TControl.GetText: TCaption;
var
  Len: Integer;
begin
  Len := GetTextLen;
  SetString(Result, PChar(nil), Len);
  if Len &lt;&gt; 0 then GetTextBuf(Pointer(Result), Len + 1);
end;
</code></pre>
<p>Mit anderen Worten: GetText, was gemäß der Property-Definition beim Lesezugriff auf das Property aufgerufen wird, gibt keine Referenz auf eine Membervariable zurück, sondern fordert den Text mittels WM_GETTEXT vom Fenster an und speichert ihn in dem temporären Stringobjekt, das zurückgegeben wird.</p>
<p>In der C++Builder-Dokumentation zur Klasse AnsiString (was dem nativen Delphi-Typen AnsiString entspricht) steht aber:</p>
<p>C++Builder 2006-Dokumentation schrieb:</p>
<blockquote>
<p>c_str gibt einen Zeiger auf ein nullterminiertes Zeichen-Array zurück, das die gleichen Zeichen wie der AnsiString enthält. Wenn dem AnsiString kein Wert zugewiesen wurde, gibt c_str einen leeren String (&quot;&quot;) zurück.<br />
In der Regel zeigt der von c_str zurückgegebene Wert auf das interne Zeichen-Array, auf das die Eigenschaft data verweist. <strong>Dieser Zeiger ist solange gültig, bis der String geändert wird</strong> (beispielsweise durch einen Aufruf der Methode SetLength <strong>oder wenn der AnsiString ungültig wird</strong>).</p>
</blockquote>
<p>Da der zurückgegebene String ein temporäres Stackobjekt ist, ist er schon nach dem Ablauf dieser Zeile</p>
<pre><code class="language-cpp">char* pw = MimiEdit-&gt;Text.c_str();
</code></pre>
<p>nicht mehr existent, und der char-Zeiger zeigt ins Nirvana. Da du dazwischen keine anderen Operationen ausführst, landen die beiden Strings zufälligerweise auf demselben Stack-Speicher - wodurch beide Zeiger auf denselben String zeigen (was du im Debugger durch den Vergleich der referenzierten Adressen sehr einfach verifizieren kannst).</p>
<p>Abhilfe schaffen kann man, indem man einfach lokale AnsiString-Objekte erstellt:</p>
<pre><code class="language-cpp">AnsiString pw = MimiEdit-&gt;Text;
AnsiString value = Edit1-&gt;Text;
MessageBoxA (Handle, pw.c_str (), &quot;&quot;, 0);
MessageBoxA (Handle, value.c_str (), &quot;&quot;, 0);
</code></pre>
<p>Und keine Sorge, es entsteht dadurch kein Performancenachteil, der nennenswert wäre - AnsiString verwendet Referenzzählung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237734</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Thu, 01 Mar 2007 20:18:22 GMT</pubDate></item><item><title><![CDATA[Reply to c_str() kaputt. on Thu, 01 Mar 2007 20:20:40 GMT]]></title><description><![CDATA[<p>Danke,</p>
<p>habs jetzt so gelöst:</p>
<pre><code class="language-cpp">char* pw = new char[MimiEdit-&gt;Text.Length()];
strcpy(pw, MimiEdit-&gt;Text.c_str());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1237736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237736</guid><dc:creator><![CDATA[Toniiii]]></dc:creator><pubDate>Thu, 01 Mar 2007 20:20:40 GMT</pubDate></item><item><title><![CDATA[Reply to c_str() kaputt. on Thu, 01 Mar 2007 20:36:13 GMT]]></title><description><![CDATA[<p>Warum einfach, wenns auch umständlich geht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
... und delete[] nicht vergessen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237746</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Thu, 01 Mar 2007 20:36:13 GMT</pubDate></item></channel></rss>