<?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[Für mich nicht nachvollziehbare Aktion.]]></title><description><![CDATA[<p>Hallo,</p>
<p>jetzt muss ich nochmal zu den Anfangsfragen:</p>
<pre><code>char temp [7];
stringstream ss;
ss &lt;&lt; &quot;Hallo!&quot;;
ss &gt;&gt; temp;
cout &lt;&lt; temp;
system (&quot;pause &gt; NUL&quot;);
</code></pre>
<p>Das dass Programm unsinnig ist, ist klar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> .<br />
Ich schreibe ja in einen undefinierten Speicher. Ich habe erwartet, dass der Compiler meckert -&gt; Fehlanzeige.</p>
<p>Jetzt das Kuriose und die Frage:</p>
<p>Warum stürzt das Programm erst <strong>nach</strong> der Pause (system (&quot;pause &gt; NUL&quot;)) ab? Theoretisch muss doch das Programm schon dann abstürzen, wenn der stringstream in temp schreibt, oder?<br />
Also nach dem Befehl:</p>
<pre><code>ss &gt;&gt; temp;
</code></pre>
<p>Warum ist das eben nicht so?</p>
<p>Ist folgende Aussage richtig?</p>
<blockquote>
<p>Übergebe ich ein String-Literal einem char-Pointer, dann schreibe ich in einen definierten Speicher.</p>
</blockquote>
<p>Beispiel:</p>
<pre><code>char *temp;
temp = &quot;Hier wird nicht in einen undefinierten Speicher geschrieben, egal, wie lange dieses String-Literal ist. Maximal eben die Stack-Größe.&quot;;
</code></pre>
<p>Ich will nur wissen, ob ich mit einem char-pointer <strong>immer</strong> in einen definierten Speicher schreibe (bis eben zu der Stackgröße).</p>
<p>MfG</p>
<p>Seikuassi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319009/für-mich-nicht-nachvollziehbare-aktion</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Jul 2026 07:33:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319009.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 03 Aug 2013 16:09:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Für mich nicht nachvollziehbare Aktion. on Sat, 03 Aug 2013 16:09:58 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>jetzt muss ich nochmal zu den Anfangsfragen:</p>
<pre><code>char temp [7];
stringstream ss;
ss &lt;&lt; &quot;Hallo!&quot;;
ss &gt;&gt; temp;
cout &lt;&lt; temp;
system (&quot;pause &gt; NUL&quot;);
</code></pre>
<p>Das dass Programm unsinnig ist, ist klar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> .<br />
Ich schreibe ja in einen undefinierten Speicher. Ich habe erwartet, dass der Compiler meckert -&gt; Fehlanzeige.</p>
<p>Jetzt das Kuriose und die Frage:</p>
<p>Warum stürzt das Programm erst <strong>nach</strong> der Pause (system (&quot;pause &gt; NUL&quot;)) ab? Theoretisch muss doch das Programm schon dann abstürzen, wenn der stringstream in temp schreibt, oder?<br />
Also nach dem Befehl:</p>
<pre><code>ss &gt;&gt; temp;
</code></pre>
<p>Warum ist das eben nicht so?</p>
<p>Ist folgende Aussage richtig?</p>
<blockquote>
<p>Übergebe ich ein String-Literal einem char-Pointer, dann schreibe ich in einen definierten Speicher.</p>
</blockquote>
<p>Beispiel:</p>
<pre><code>char *temp;
temp = &quot;Hier wird nicht in einen undefinierten Speicher geschrieben, egal, wie lange dieses String-Literal ist. Maximal eben die Stack-Größe.&quot;;
</code></pre>
<p>Ich will nur wissen, ob ich mit einem char-pointer <strong>immer</strong> in einen definierten Speicher schreibe (bis eben zu der Stackgröße).</p>
<p>MfG</p>
<p>Seikuassi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343215</guid><dc:creator><![CDATA[PHBU]]></dc:creator><pubDate>Sat, 03 Aug 2013 16:09:58 GMT</pubDate></item><item><title><![CDATA[Reply to Für mich nicht nachvollziehbare Aktion. on Sat, 03 Aug 2013 16:26:30 GMT]]></title><description><![CDATA[<p>Seikuassi schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>jetzt muss ich nochmal zu den Anfangsfragen:</p>
<pre><code>char temp [7];
stringstream ss;
ss &lt;&lt; &quot;Hallo!&quot;;
ss &gt;&gt; temp;
cout &lt;&lt; temp;
system (&quot;pause &gt; NUL&quot;);
</code></pre>
<p>Das dass Programm unsinnig ist, ist klar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> .<br />
Ich schreibe ja in einen undefinierten Speicher. Ich habe erwartet, dass der Compiler meckert -&gt; Fehlanzeige.</p>
<p>Jetzt das Kuriose und die Frage:</p>
<p>Warum stürzt das Programm erst <strong>nach</strong> der Pause (system (&quot;pause &gt; NUL&quot;)) ab? Theoretisch muss doch das Programm schon dann abstürzen, wenn der stringstream in temp schreibt, oder?<br />
Also nach dem Befehl:</p>
<pre><code>ss &gt;&gt; temp;
</code></pre>
<p>Warum ist das eben nicht so?</p>
</blockquote>
<p>Das ist undefiniert, auf einem anderen Rechner auch an anderer Stelle abstürzen.<br />
Fakt ist jedoch, dass das kein Compiler merkt. Du gibst einen Zeiger an den Stream und der schreibt munter darein. Egal was sich hinter dem Zeiger befindet. Der Compiler merkt da nix.<br />
Warum solche Programm beim Beenden abstürzen liegt daran, dass das Betriebsystem oder die Laufzeitumgebung da einige Schutzmechanismen hat. Und die prüfen am Ende nochmal und finden meistens den Fehler.</p>
<p>Seikuassi schrieb:</p>
<blockquote>
<p>Ist folgende Aussage richtig?</p>
<blockquote>
<p>Übergebe ich ein String-Literal einem char-Pointer, dann schreibe ich in einen definierten Speicher.</p>
</blockquote>
<p>Beispiel:</p>
<pre><code>char *temp;
temp = &quot;Hier wird nicht in einen undefinierten Speicher geschrieben, egal, wie lange dieses String-Literal ist. Maximal eben die Stack-Größe.&quot;;
</code></pre>
<p>Ich will nur wissen, ob ich mit einem char-pointer <strong>immer</strong> in einen definierten Speicher schreibe (bis eben zu der Stackgröße).</p>
</blockquote>
<p>Nein, du schreibst ja nicht in den &quot;Zeiger&quot;. Du lässt den Zeiger nur auf ein kosntantes Stringliteral zeigen (welches im globalen statischen Speicher liegt). Lesend darauf zuzugreifen ist ok, aber wehe du schreibst, dann gibts Ärger vom Compiler/Betriebssystem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343220</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 03 Aug 2013 16:26:30 GMT</pubDate></item><item><title><![CDATA[Reply to Für mich nicht nachvollziehbare Aktion. on Sat, 03 Aug 2013 16:30:40 GMT]]></title><description><![CDATA[<p>Seikuassi schrieb:</p>
<blockquote>
<pre><code>char temp [7];
stringstream ss;
ss &lt;&lt; &quot;Hallo!&quot;;
ss &gt;&gt; temp;
cout &lt;&lt; temp;
</code></pre>
<p>Das dass Programm unsinnig ist, ist klar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> .<br />
Ich schreibe ja in einen undefinierten Speicher.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Ich verstehe nicht, was du sagen willst? Im Array ist Platz für 7 Zeichen. <code>&quot;Hallo!&quot;</code> hat 7 Zeichen. Wo liegts Problem? Wo sollte hier was abkacken?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343221</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sat, 03 Aug 2013 16:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to Für mich nicht nachvollziehbare Aktion. on Sat, 03 Aug 2013 17:51:19 GMT]]></title><description><![CDATA[<p>Hallo nochmal,</p>
<p>danke für die Antworten!</p>
<blockquote>
<p>Nein, du schreibst ja nicht in den &quot;Zeiger&quot;.</p>
</blockquote>
<p>Ach ja, stimmt ja. Im Prinzip ist das String-Literal eine &quot;Adresse&quot; auf den ja ein Zeiger zeigen kann.<br />
Heißt das, wenn ich einem char-Pointer 0 (als Zahl) übergebe, ist das das Gleiche wie &quot;&quot;, oder ist diese Aktion auch undefiniert (habe nämlich manche Situationen, in denen ich statt &quot;&quot; 0 übergebe (schreibfaul <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>
<blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Ich verstehe nicht, was du sagen willst? Im Array ist Platz für 7 Zeichen. &quot;Hallo!&quot; hat 7 Zeichen. Wo liegts Problem? Wo sollte hier was abkacken?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> Habe aus Versehen schon den richtigen Code verwendet. Beim alten bestand temp aus einem einzigen char ([1]).</p>
<p>MfG</p>
<p>Seikuassi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343235</guid><dc:creator><![CDATA[PHBU]]></dc:creator><pubDate>Sat, 03 Aug 2013 17:51:19 GMT</pubDate></item><item><title><![CDATA[Reply to Für mich nicht nachvollziehbare Aktion. on Sat, 03 Aug 2013 18:02:28 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich schreibe ja in einen undefinierten Speicher.</p>
</blockquote>
<p>Nein, das wäre der Fall, wenn du einen Zeiger hättest (char*). Aber hier legst du ein Array an, wie out bereits erklärte. Wurde auch durch Skym0sh0 irritiert.</p>
<blockquote>
<p>kosntantes Stringliteral</p>
</blockquote>
<p>Was wäre denn ein nicht konstantes Literal, bzw. was genau daran ist konstant (der Typ ist es ja schließlich nicht)? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Alle herkömmlichen Literale sind <em>prvalues</em>, falls du das meinst.</p>
<blockquote>
<p>Im Prinzip ist das String-Literal eine &quot;Adresse&quot;</p>
</blockquote>
<p>Nicht ganz. Ein Stringliteral hat Arraytyp. Dank array-to-pointer-decay kann es aber in den meisten Fällen als Zeiger behandelt werden.</p>
<p>§2.14.5/8 schrieb:</p>
<blockquote>
<p>Ordinary string literals and UTF-8 string literals are also referred to as narrow string literals. A narrow string literal has type “array of n const char”, where n is the size of the string as defined below, and has static storage duration.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2343238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343238</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 03 Aug 2013 18:02:28 GMT</pubDate></item><item><title><![CDATA[Reply to Für mich nicht nachvollziehbare Aktion. on Sat, 03 Aug 2013 18:24:03 GMT]]></title><description><![CDATA[<p>Seikuassi schrieb:</p>
<blockquote>
<p>Ist folgende Aussage richtig?</p>
<blockquote>
<p>Übergebe ich ein String-Literal einem char-Pointer, dann schreibe ich in einen definierten Speicher.</p>
</blockquote>
</blockquote>
<p>Die Aussage ist völlig sinnlos. Ich bezweifle, dass du verstanden hast, was du da tust.</p>
<p>Benutze std::string!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343242</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 03 Aug 2013 18:24:03 GMT</pubDate></item><item><title><![CDATA[Reply to Für mich nicht nachvollziehbare Aktion. on Sat, 03 Aug 2013 20:28:46 GMT]]></title><description><![CDATA[<p>Ich glaube, du bist ziemlich verwirrt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Seikuassi schrieb:</p>
<blockquote>
<p>Heißt das, wenn ich einem char-Pointer 0 (als Zahl) übergebe, ist das das Gleiche wie &quot;&quot;, oder ist diese Aktion auch undefiniert (habe nämlich manche Situationen, in denen ich statt &quot;&quot; 0 übergebe</p>
</blockquote>
<p>&quot;&quot; und 0 haben überhaupt nichts gemeinsam.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> 0 ist ein int. Wenn du einem Zeiger 0 zuweist, dann zeigt der Zeiger auf nichts.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> &quot;&quot; ist ein Zeichenkettenliteral vom Typ const char[1]. Wenn du einem char-Zeiger &quot;&quot; zuweist, dann zeigt er auf das erste Element des Arrays. In diesem Fall ist das erste Element '\0'.</p>
<p>Seikuassi schrieb:</p>
<blockquote>
<p>Ich schreibe ja in einen undefinierten Speicher.</p>
</blockquote>
<p>Undefinierten Speicher? Ähh, du meinst wohl Speicher der dir nicht gehört. Speicher der dir nicht gehört, darfst du nicht anfassen. Wenn du da was reinschreibst, dann krachts hoffentlich. Sogar das Lesen ist nicht erlaubt, wenn ich mich nicht irre.</p>
<p>Seikuassi schrieb:</p>
<blockquote>
<p>Übergebe ich ein String-Literal einem char-Pointer, dann schreibe ich in einen definierten Speicher.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
1. Literale sind konstant. Da ist nichts mit schreiben. :p<br />
2. Du schreibst du nur in einen gültigen Speicher (Speicher der dir gehört), wenn sich hinter dem char-Zeiger ein char-Array verbirgt, das mindestens so viel Platz hat, wie die maximale Anzahl Zeichen, die du schreiben willst, ansonsten BOOM.</p>
<p>Gäbe es doch nur etwas, das mir diese elende Denkerei abnimmst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> Ich sehe etwas herbei eilen. Es nennt sich std::string. Eine tolle Erfindung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343267</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sat, 03 Aug 2013 20:28:46 GMT</pubDate></item><item><title><![CDATA[Reply to Für mich nicht nachvollziehbare Aktion. on Sun, 04 Aug 2013 13:51:50 GMT]]></title><description><![CDATA[<p>Seikuassi schrieb:</p>
<blockquote>
<p>Warum stürzt das Programm erst <strong>nach</strong> der Pause (system (&quot;pause &gt; NUL&quot;)) ab? Theoretisch muss doch das Programm schon dann abstürzen, wenn der stringstream in temp schreibt, oder?</p>
</blockquote>
<p>Nein. temp befindet sich auf dem Stack, da wird noch viel, viel Speicher über temp frei sein, du schreibst also in gültigen Speicher. Jetzt ist aber das Problem dass andere Werte über temp liegen. Die überschreibst du.<br />
Das geht wohl bis zu system() gut weil die Daten bis dahin nicht benutzt werden. Nach System möchte irgendein Befehl mit diesen falschen Daten arbeiten und es kracht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343357</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 04 Aug 2013 13:51:50 GMT</pubDate></item></channel></rss>