<?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[Zeiger und Konstanten]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgenden C++Code:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

int main(int argc, char *argv[]){

	const int i = 10;
	int *pi = (int*) &amp;i;
	cout &lt;&lt; &quot;Adresse von i: &quot; &lt;&lt; &amp;i &lt;&lt; endl;
	cout &lt;&lt; &quot;Inhalt von pi: &quot; &lt;&lt; pi &lt;&lt; endl;
	cout &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; endl;
	cout &lt;&lt; &quot;*pi: &quot; &lt;&lt; *pi &lt;&lt; endl;
	*pi=1;
	cout &lt;&lt; &quot;&amp;i: &quot; &lt;&lt; &amp;i &lt;&lt; endl;
	cout &lt;&lt; &quot;pi: &quot; &lt;&lt; pi &lt;&lt; endl;
	cout &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; endl;
	cout &lt;&lt; &quot;*pi: &quot; &lt;&lt; *pi &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Ausgegeben wird auf der Konsole unter Linux 32 Bit:</p>
<blockquote>
<p>Adresse von i: 0xbfa6089c<br />
Inhalt von pi: 0xbfa6089c<br />
i: 10<br />
*pi: 10<br />
&amp;i: 0xbfa6089c<br />
pi: 0xbfa6089c<br />
i: 10<br />
*pi: 1</p>
</blockquote>
<p>i ist eine Konstante, wobei ich versuche, diese über den Zeiger pi zu ändern. Laut Memory-Dump beim Debuggen mit Eclipse gelingt mir das auch. Nur wird bei der Ausgabe in der Konsole nach dem Setzen von *pi = 1 wird für i der Wert 10 ausgegeben. Wie kann das sein?</p>
<p>Mir geht es bei der ganzen Sachen nur um das Verständnis, weil ich C++ lernen möchte <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>Gruß<br />
acelab</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284851/zeiger-und-konstanten</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 19:10:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284851.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Apr 2011 18:29:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger und Konstanten on Sat, 09 Apr 2011 18:32:31 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgenden C++Code:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

int main(int argc, char *argv[]){

	const int i = 10;
	int *pi = (int*) &amp;i;
	cout &lt;&lt; &quot;Adresse von i: &quot; &lt;&lt; &amp;i &lt;&lt; endl;
	cout &lt;&lt; &quot;Inhalt von pi: &quot; &lt;&lt; pi &lt;&lt; endl;
	cout &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; endl;
	cout &lt;&lt; &quot;*pi: &quot; &lt;&lt; *pi &lt;&lt; endl;
	*pi=1;
	cout &lt;&lt; &quot;&amp;i: &quot; &lt;&lt; &amp;i &lt;&lt; endl;
	cout &lt;&lt; &quot;pi: &quot; &lt;&lt; pi &lt;&lt; endl;
	cout &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; endl;
	cout &lt;&lt; &quot;*pi: &quot; &lt;&lt; *pi &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Ausgegeben wird auf der Konsole unter Linux 32 Bit:</p>
<blockquote>
<p>Adresse von i: 0xbfa6089c<br />
Inhalt von pi: 0xbfa6089c<br />
i: 10<br />
*pi: 10<br />
&amp;i: 0xbfa6089c<br />
pi: 0xbfa6089c<br />
i: 10<br />
*pi: 1</p>
</blockquote>
<p>i ist eine Konstante, wobei ich versuche, diese über den Zeiger pi zu ändern. Laut Memory-Dump beim Debuggen mit Eclipse gelingt mir das auch. Nur wird bei der Ausgabe in der Konsole nach dem Setzen von *pi = 1 wird für i der Wert 10 ausgegeben. Wie kann das sein?</p>
<p>Mir geht es bei der ganzen Sachen nur um das Verständnis, weil ich C++ lernen möchte <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>Gruß<br />
acelab</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046857</guid><dc:creator><![CDATA[acelab]]></dc:creator><pubDate>Sat, 09 Apr 2011 18:32:31 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Konstanten on Sat, 09 Apr 2011 18:35:52 GMT]]></title><description><![CDATA[<p>Schreiben in eine konstante Variable erzeugt undefiniertes Verhalten, d.h. du kannst nicht vorhersagen, was herauskommt, wenn du versuchst den Compiler auszutricksen - das kann in einem SegFault enden oder auch in derart &quot;seltsamen Ausgaben&quot;.<br />
(in deinem Beispiel hat der Compiler i vermutlich in ein Register kopiert, weil er davon ausging, daß sie sowieso nicht geschrieben wird)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046859</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Apr 2011 18:35:52 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Konstanten on Sat, 09 Apr 2011 18:37:36 GMT]]></title><description><![CDATA[<p>Du darfst Konstanten in C++ eben nicht einfach so ändern.<br />
Und der C++ Compiler darf davon ausgehen dass du es nicht tust, und daher direkt den Wert <code>10</code> einsetzen wenn du irgendwo <code>i</code> schreibst.<br />
Das <code>cout &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; endl;</code> wird also einfach zu <code>cout &lt;&lt; &quot;i: &quot; &lt;&lt; 10 &lt;&lt; endl;</code> - und das ist halt unabhängig davon was du über <code>pi</code> irgendwo in den Speicher geschrieben hast.<br />
Vereinfacht gesagt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046860</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 09 Apr 2011 18:37:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Konstanten on Sat, 09 Apr 2011 18:44:15 GMT]]></title><description><![CDATA[<p>Du kannst auch mal versuchen, i als</p>
<pre><code class="language-cpp">static const int i = 10;
</code></pre>
<p>zu definieren, der Speicher liegt nun im readonly-Bereich (global/static). Ein Schreiben in diesem Bereich dürfte auf jeden Fall zum Absturz führen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046865</guid><dc:creator><![CDATA[_Falke]]></dc:creator><pubDate>Sat, 09 Apr 2011 18:44:15 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Konstanten on Sat, 09 Apr 2011 19:05:21 GMT]]></title><description><![CDATA[<p>_Falke schrieb:</p>
<blockquote>
<p>Du kannst auch mal versuchen, i als</p>
<pre><code class="language-cpp">static const int i = 10;
</code></pre>
<p>zu definieren, der Speicher liegt nun im readonly-Bereich (global/static). Ein Schreiben in diesem Bereich dürfte auf jeden Fall zum Absturz führen.</p>
</blockquote>
<p>Stimmt. Aber wenn ich mein Programm erweitere zu:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

int main(int argc, char *argv[]){

	const int i = 10;
	int *pi = (int*) &amp;i;
	cout &lt;&lt; &quot;Adresse von i: &quot; &lt;&lt; &amp;i &lt;&lt; endl;
	cout &lt;&lt; &quot;Inhalt von pi: &quot; &lt;&lt; pi &lt;&lt; endl;
	cout &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; endl;
	cout &lt;&lt; &quot;*pi: &quot; &lt;&lt; *pi &lt;&lt; endl;
	*pi=1;
	cout &lt;&lt; &quot;&amp;i: &quot; &lt;&lt; &amp;i &lt;&lt; endl;
	cout &lt;&lt; &quot;pi: &quot; &lt;&lt; pi &lt;&lt; endl;
	cout &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; endl;
	cout &lt;&lt; &quot;*pi: &quot; &lt;&lt; *pi &lt;&lt; endl;
	int *pi2 = (int*) &amp;i;
	cout &lt;&lt; &quot;pi2: &quot; &lt;&lt; pi2 &lt;&lt; endl;
	cout &lt;&lt; &quot;*pi2: &quot; &lt;&lt; *pi2 &lt;&lt; endl;
	return 0;
}
</code></pre>
<p>Wieso wird dann laut folgender Konsolenausgabe:</p>
<blockquote>
<p>Adresse von i: 0xbfaf743c<br />
Inhalt von pi: 0xbfaf743c<br />
i: 10<br />
*pi: 10<br />
&amp;i: 0xbfaf743c<br />
pi: 0xbfaf743c<br />
i: 10<br />
*pi: 1<br />
pi2: 0xbfaf743c<br />
*pi2: 1</p>
</blockquote>
<p>pi2 zu 1, obwohl für i zuvor 10 ausgegeben wurde. Wenn i in einem Register ist, und *pi=1 diesen Wert nicht verändert hat, dann sollte doch</p>
<p>int *pi2 = (int*) &amp;i;<br />
cout &lt;&lt; &quot;pi2: &quot; &lt;&lt; pi2 &lt;&lt; endl;<br />
cout &lt;&lt; &quot;*pi2: &quot; &lt;&lt; *pi2 &lt;&lt; endl;</p>
<p>den Wert 10 für *pi2 ausgeben.</p>
<p>Ich verstehe das nicht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046874</guid><dc:creator><![CDATA[acelab]]></dc:creator><pubDate>Sat, 09 Apr 2011 19:05:21 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Konstanten on Sat, 09 Apr 2011 19:10:01 GMT]]></title><description><![CDATA[<p>Die Variable i liegt trotz aller Optimierungen noch irgendwo auf dem Stack, sonst könntest du überhaupt nicht ihre Adresse ermitteln oder Pointer definieren, die auf sie zeigen. Das hindert den Compiler aber nicht daran, die <strong>direkten</strong> Zugriffe auf die Variable zu optimieren (per Register oder wie hustbaer erwähnt per direkte Wert-Ersetzung).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046878</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Apr 2011 19:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Konstanten on Sat, 09 Apr 2011 19:47:09 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Die Variable i liegt trotz aller Optimierungen noch irgendwo auf dem Stack, sonst könntest du überhaupt nicht ihre Adresse ermitteln oder Pointer definieren, die auf sie zeigen. Das hindert den Compiler aber nicht daran, die <strong>direkten</strong> Zugriffe auf die Variable zu optimieren (per Register oder wie hustbaer erwähnt per direkte Wert-Ersetzung).</p>
</blockquote>
<p>Ok, ich verstehe. Da war das nochmalige Nachfragen ganz sinnvoll.</p>
<p>Danke an Alle!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046902</guid><dc:creator><![CDATA[acelab]]></dc:creator><pubDate>Sat, 09 Apr 2011 19:47:09 GMT</pubDate></item></channel></rss>