<?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[Fehler bei Zeigern ?!]]></title><description><![CDATA[<p>Hi, um mich mit den Zeigern etwas besser auseinanderzusetzen habe ich eine kleine Methode geschrieben die 2 strings vertauscht , mir ist klar das man das auch anders lösen kann.<br />
Wenn ich das ganze richtig verstanden habe sollte folgendes<br />
auch ohne probleme laufen...</p>
<pre><code>bool swap_strings(char * str1, char * str2){
	int lenstr1 = 0;
	int lenstr2 = 0;
	lenstr1 = strlen(str1);
	lenstr2 = strlen(str2);

	if(lenstr1 != lenstr2)
	{
		return false;
	}
	char  tmp = '\0';
	int i;
	for(i = 0; i &lt; lenstr1; i++ )
	{
		tmp = *(str1 + i);
		cout &lt;&lt; tmp &lt;&lt; endl;
//---	//	*(str1 + i) = *(str2 + i);
//---	//	*(str2 + i) = tmp;
	}
        //DEBUG
	cout &lt;&lt; &quot;str 1 neu : &quot; &lt;&lt; str1 &lt;&lt; endl;
	cout &lt;&lt; &quot;str 2 neu : &quot; &lt;&lt; str2 &lt;&lt; endl;
	return true;

}
</code></pre>
<p>leider erhalte ich eine Exception : Status_Access_Violation<br />
der fehler liegt bei dem mit //--- // kommentierten code, allerdings verstehe ich nicht wo.</p>
<p>*(str1 + i) entspricht dem inhalt/wert von str1[i] , es sollte also eigentlich nur eine ganz normale char vertauschung stattfinden oder ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/236453/fehler-bei-zeigern</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 21:41:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/236453.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 Mar 2009 15:03:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehler bei Zeigern ?! on Sun, 15 Mar 2009 15:03:57 GMT]]></title><description><![CDATA[<p>Hi, um mich mit den Zeigern etwas besser auseinanderzusetzen habe ich eine kleine Methode geschrieben die 2 strings vertauscht , mir ist klar das man das auch anders lösen kann.<br />
Wenn ich das ganze richtig verstanden habe sollte folgendes<br />
auch ohne probleme laufen...</p>
<pre><code>bool swap_strings(char * str1, char * str2){
	int lenstr1 = 0;
	int lenstr2 = 0;
	lenstr1 = strlen(str1);
	lenstr2 = strlen(str2);

	if(lenstr1 != lenstr2)
	{
		return false;
	}
	char  tmp = '\0';
	int i;
	for(i = 0; i &lt; lenstr1; i++ )
	{
		tmp = *(str1 + i);
		cout &lt;&lt; tmp &lt;&lt; endl;
//---	//	*(str1 + i) = *(str2 + i);
//---	//	*(str2 + i) = tmp;
	}
        //DEBUG
	cout &lt;&lt; &quot;str 1 neu : &quot; &lt;&lt; str1 &lt;&lt; endl;
	cout &lt;&lt; &quot;str 2 neu : &quot; &lt;&lt; str2 &lt;&lt; endl;
	return true;

}
</code></pre>
<p>leider erhalte ich eine Exception : Status_Access_Violation<br />
der fehler liegt bei dem mit //--- // kommentierten code, allerdings verstehe ich nicht wo.</p>
<p>*(str1 + i) entspricht dem inhalt/wert von str1[i] , es sollte also eigentlich nur eine ganz normale char vertauschung stattfinden oder ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1680425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1680425</guid><dc:creator><![CDATA[tallan]]></dc:creator><pubDate>Sun, 15 Mar 2009 15:03:57 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Zeigern ?! on Sun, 15 Mar 2009 15:12:49 GMT]]></title><description><![CDATA[<p>wie rufst du die funktion auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1680428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1680428</guid><dc:creator><![CDATA[frager]]></dc:creator><pubDate>Sun, 15 Mar 2009 15:12:49 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Zeigern ?! on Sun, 15 Mar 2009 15:17:23 GMT]]></title><description><![CDATA[<p>hab den fehler gefunden,<br />
hatte als aufruf 2 &quot;strings&quot; mit char * x = &quot;...&quot;;<br />
angelegt und diese übergeben es muss aber wohl per char x[] = &quot;...&quot;;<br />
inizialisiert werden. Wobei mir hier nicht ganz klar ist wo der unterschied liegt ?<br />
x ist doch auch nur ein zeiger auf x[0] ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1680429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1680429</guid><dc:creator><![CDATA[tallan]]></dc:creator><pubDate>Sun, 15 Mar 2009 15:17:23 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Zeigern ?! on Sun, 15 Mar 2009 15:29:07 GMT]]></title><description><![CDATA[<p>char * x = &quot;...&quot;;</p>
<p>&quot;...&quot; ist ein literal und somit konstant. zusätzlich legen die compiler (nicht alle) die daten in einen speicherbereich der nicht änderbar ist und dadurch nur gelesen werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1680431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1680431</guid><dc:creator><![CDATA[frager]]></dc:creator><pubDate>Sun, 15 Mar 2009 15:29:07 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Zeigern ?! on Sun, 15 Mar 2009 15:42:27 GMT]]></title><description><![CDATA[<p>Auch bei Arrays kannst du nicht einfach so die Strings wechseln.</p>
<p>Was bei Literalen geht, ist den Zeiger zu ändern, aber nicht den Speicherbereich selbst. Dann müsstest du die Zeiger aber als Referenz oder als Zeiger übergeben. Oder direkt <code>std::swap()</code> verwenden. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1680436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1680436</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 15 Mar 2009 15:42:27 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Zeigern ?! on Sun, 15 Mar 2009 19:34:32 GMT]]></title><description><![CDATA[<p>es ging ja darum nichts festes zu verwenden <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>und es funktioniert ja so wie es sollte, ich wusste nur nicht das char * x = &quot;...&quot;<br />
anders angelegt wird als char x[] = &quot;...&quot;</p>
<p>aber danke nochmals</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1680528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1680528</guid><dc:creator><![CDATA[tallan]]></dc:creator><pubDate>Sun, 15 Mar 2009 19:34:32 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Zeigern ?! on Sun, 15 Mar 2009 19:44:53 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21880">@tallan</a>,<br />
Deshalb sollte man ein Zeiger auf ein String-Literal immer als konstant definieren, also:</p>
<pre><code class="language-cpp">char const* p = &quot;Hello World!&quot;;
</code></pre>
<p>Was der Unterschied zwischen diesen zweien ist, ist dir aber nun klar?</p>
<pre><code class="language-cpp">char const* s1 = &quot;Hello&quot;;
char s2[] = &quot;Hello&quot;;
</code></pre>
<p>(Wenn ich es nicht wüsste, wäre es mir nämlich aus dem, was im Thread geschrieben wurde, nicht klar geworden ;))</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1680533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1680533</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 15 Mar 2009 19:44:53 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Zeigern ?! on Mon, 16 Mar 2009 06:27:54 GMT]]></title><description><![CDATA[<p>ich hoffe das ich es verstanden habe,</p>
<p>char bla[] = &quot;xxx&quot; alokiert speicher für 3 * char element fortlaufend ab der adresse von bla.<br />
bei char * bla = &quot;xxx&quot; wird dieser speicher u.u. in einem bereich angelegt der schreibgeschützt ist und somit sind änderungen der &quot;werte&quot; wie bla[i] = 'c'<br />
nicht möglich sondern allenfalls eine änderung der zeiger !?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1680656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1680656</guid><dc:creator><![CDATA[tallan]]></dc:creator><pubDate>Mon, 16 Mar 2009 06:27:54 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Zeigern ?! on Mon, 16 Mar 2009 10:01:10 GMT]]></title><description><![CDATA[<p>tallan schrieb:</p>
<blockquote>
<p>char bla[] = &quot;xxx&quot; alokiert speicher für 3 * char element fortlaufend ab der adresse von bla.</p>
</blockquote>
<p>Nicht ganz.<br />
Grundsätzlich wird hier ein Array allokiert, welches Speicher für <strong>4</strong> <code>char</code> Elemente hat. Das 4. Element wird für die Null-Terminierung verwendet ( <code>'\0'</code> ). Man könnte es auch anders schreiben:</p>
<pre><code class="language-cpp">char bla[] = { 'x', 'x', 'x', '\0' };
</code></pre>
<p>Des Weiteren sollte man klarstelle, dass <code>bla</code> keine Adresse ist. <code>bla</code> ist ein Array-Objekt. Ein Array-Objekt lässt sich nicht kopieren, man kann allerdings ein Zeiger oder eine Referenz auf ein Array-Objekt erstellen. Dies geht so:</p>
<pre><code class="language-cpp">char bla[] = &quot;xxx&quot;;
char (*p)[4] = &amp;bla;
char (&amp;r)[4] = bla;
</code></pre>
<p>Das wird dich wahrscheinlich überraschen, vor allem der Zeiger, da du eher an sowas gedacht hättest:</p>
<pre><code class="language-cpp">char* p = bla;
</code></pre>
<p>Tatsächlich passiert in diesem Fall eine implizite Konvertierung von dem Array-Objekt zu einem Zeiger auf das erste Element. Es ist also gleichbedeutend mit:</p>
<pre><code class="language-cpp">char* p = &amp;bla[0];
</code></pre>
<p>Die implizite Konvertierung funktioniert nur bei 1-dimensionalen Arrays. Bei mehrdimensionalen Arrays empfiehlt es sich über die andere Version vorzugehen. Wenn möglich sollte man sowieso auf mehrdimensionale Arrays verzichten. Die Emulation ist meistens deutlich einfacher.</p>
<pre><code class="language-cpp">char multiDim[4][5];
char* p1 = multiDim; // FEHLER
char* p2 = &amp;multiDim[0][0]; // RICHTIG

// Zeiger auf ein multi-dimensionales Array:
char (*p3)[4][5] = multiDim;

// Emulation:
char emuMultiDim[20];
std::size_t const rowSize = 4;

emuMultiDim[rowSize * y + x];
// Am besten natürlich in eine Klasse gekapselt
// oder bereits existierende Konstrukte verwenden.
</code></pre>
<p>tallan schrieb:</p>
<blockquote>
<p>bei char * bla = &quot;xxx&quot; wird dieser speicher u.u. in einem bereich angelegt der schreibgeschützt ist und somit sind änderungen der &quot;werte&quot; wie bla[i] = 'c' nicht möglich sondern allenfalls eine änderung der zeiger !?</p>
</blockquote>
<p>Was verstehst du unter Änderung der Zeiger? Meinst du das:</p>
<pre><code class="language-cpp">char const* bla = &quot;xxx&quot;;
bla = &quot;yyy&quot;;
</code></pre>
<p>Dann ja, richtig <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="🙂"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1680718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1680718</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 16 Mar 2009 10:01:10 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Zeigern ?! on Mon, 16 Mar 2009 14:18:36 GMT]]></title><description><![CDATA[<p>Vielen Dank für die ausführliche Antwort</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1680873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1680873</guid><dc:creator><![CDATA[tallan]]></dc:creator><pubDate>Mon, 16 Mar 2009 14:18:36 GMT</pubDate></item></channel></rss>