<?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[Warum funktioniert diese rekursion nicht?]]></title><description><![CDATA[<p>Hallo,</p>
<p>mit dem folgenden Minimalbeispiel gibt es einen speicherzugriffsfehler.<br />
Mir ist nicht ganz klar warum. Ich laufe rekursiv durch und eigentlich lege ich doch mit *pm in der signatur einen pointer an der auf den pointer der vorherigen rekursion zeigt. warum klappt das nicht? Könnte es sein dass ich<br />
bei der abbruchbedingung dann (für den fall i = 4) ****pm schreiben müsste?<br />
Ich würde mich über genaue Aufklärung sehr freuen! Danke</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void foo(int* pm, int i)
{
        std::cout &lt;&lt; &quot;It: &quot; &lt;&lt; i &lt;&lt; std::endl;
        if (i == 0) 
        {
            *pm = 3;
            return;
        }
        foo(pm,i-1);
}

int main()
{
    int *m = NULL;
    foo(m,4);
    std::cout &lt;&lt; &quot;ENDE: &quot; &lt;&lt; *m &lt;&lt; std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/262586/warum-funktioniert-diese-rekursion-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 13:02:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262586.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Mar 2010 16:37:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 16:37:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mit dem folgenden Minimalbeispiel gibt es einen speicherzugriffsfehler.<br />
Mir ist nicht ganz klar warum. Ich laufe rekursiv durch und eigentlich lege ich doch mit *pm in der signatur einen pointer an der auf den pointer der vorherigen rekursion zeigt. warum klappt das nicht? Könnte es sein dass ich<br />
bei der abbruchbedingung dann (für den fall i = 4) ****pm schreiben müsste?<br />
Ich würde mich über genaue Aufklärung sehr freuen! Danke</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void foo(int* pm, int i)
{
        std::cout &lt;&lt; &quot;It: &quot; &lt;&lt; i &lt;&lt; std::endl;
        if (i == 0) 
        {
            *pm = 3;
            return;
        }
        foo(pm,i-1);
}

int main()
{
    int *m = NULL;
    foo(m,4);
    std::cout &lt;&lt; &quot;ENDE: &quot; &lt;&lt; *m &lt;&lt; std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1866016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866016</guid><dc:creator><![CDATA[Matse]]></dc:creator><pubDate>Mon, 08 Mar 2010 16:37:09 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 16:39:41 GMT]]></title><description><![CDATA[<p>*pm = 3;</p>
<p>denk mal nach auf welchen Speicher pm zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866019</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 08 Mar 2010 16:39:41 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 16:50:26 GMT]]></title><description><![CDATA[<p>*pm = 3 liegt auf dem stack. ich bin mir nicht sicher - kann es sein dass pro rekursion ein eigener stack angelegt wird - wohl ja. heißt dass dann das *pm = 3 auf dem &quot;innersten&quot; stack liegt ? dieser danach nicht mehr verfügbar ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866034</guid><dc:creator><![CDATA[Matse]]></dc:creator><pubDate>Mon, 08 Mar 2010 16:50:26 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 16:52:27 GMT]]></title><description><![CDATA[<p>Matse schrieb:</p>
<blockquote>
<p>*pm = 3 liegt auf dem stack. ich bin mir nicht sicher - kann es sein dass pro rekursion ein eigener stack angelegt wird - wohl ja. heißt dass dann das *pm = 3 auf dem &quot;innersten&quot; stack liegt ? dieser danach nicht mehr verfügbar ist?</p>
</blockquote>
<p>nein, vergiss die rekursion.<br />
was passiert hier:</p>
<pre><code class="language-cpp">int main() {
  int* p=NULL;
  *p=3;
}
</code></pre>
<p>?</p>
<p>und vergleiche das mit:</p>
<pre><code class="language-cpp">int main() {
  int i;
  int* p=&amp;i;
  *p=3;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1866035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866035</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 08 Mar 2010 16:52:27 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 16:52:39 GMT]]></title><description><![CDATA[<p>m zeigt auf 0</p>
<p>Matse schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int *m = NULL;
    foo(m,4);
</code></pre>
</blockquote>
<p>Hier würde es auf das Objekt m vom Typ int zeigen welches auf dem Stack liegt:</p>
<pre><code class="language-cpp">int m = 0;
foo(&amp;m, 4);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1866036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866036</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Mon, 08 Mar 2010 16:52:39 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 16:58:12 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Matse schrieb:</p>
<blockquote>
<p>*pm = 3 liegt auf dem stack. ich bin mir nicht sicher - kann es sein dass pro rekursion ein eigener stack angelegt wird - wohl ja. heißt dass dann das *pm = 3 auf dem &quot;innersten&quot; stack liegt ? dieser danach nicht mehr verfügbar ist?</p>
</blockquote>
<p>nein, vergiss die rekursion.<br />
was passiert hier:</p>
<pre><code class="language-cpp">int main() {
  int* p=NULL;
  *p=3;
}
</code></pre>
<p>?</p>
<p>und vergleiche das mit:</p>
<pre><code class="language-cpp">int main() {
  int i;
  int* p=&amp;i;
  *p=3;
}
</code></pre>
</blockquote>
<p>also korrigiert mich bitte: beim ersten dereferenziere ich einen nicht zugewiesenen pointer oder? Das ist nicht erlaubt oder? deswgen der speicherzugriffsfehler ?<br />
für mein ausgangsproblem läuft er bis nach unten druch und dereferenziert er auch hier einen nicht zugewiesenen pointer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866041</guid><dc:creator><![CDATA[Matse]]></dc:creator><pubDate>Mon, 08 Mar 2010 16:58:12 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 17:20:17 GMT]]></title><description><![CDATA[<p>Matse schrieb:</p>
<blockquote>
<p>für mein ausgangsproblem läuft er bis nach unten druch und dereferenziert er auch hier einen nicht zugewiesenen pointer?</p>
</blockquote>
<p>Auch. Aber der Fehler funktioniert schon früher. Ich werde die Funktion mal inline machen und die Rekursion durch eine äquivalente Schleife ersetzen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main()
{
    int *m = NULL;

    for(int i=4;;--i)
    {
     std::cout &lt;&lt; &quot;It: &quot; &lt;&lt; i &lt;&lt; std::endl;
     if (i == 0)
      {
        *m = 3;
         break;
      }
    }

    std::cout &lt;&lt; &quot;ENDE: &quot; &lt;&lt; *m &lt;&lt; std::endl;
}
</code></pre>
<p>Dieser Code ist 1:1 äquivalent zu deinem Beispielprogramm. Fällt dir vielleicht jetzt etwas auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866053</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 08 Mar 2010 17:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 17:26:35 GMT]]></title><description><![CDATA[<p>Matse schrieb:</p>
<blockquote>
<p>also korrigiert mich bitte: beim ersten dereferenziere ich einen nicht zugewiesenen pointer oder?</p>
</blockquote>
<p>Der Zeiger ist schon initialisiert, nämlich mit <code>NULL</code> . Nullzeiger dereferenzieren darf man nicht.</p>
<p>Matse schrieb:</p>
<blockquote>
<p>für mein ausgangsproblem läuft er bis nach unten druch und dereferenziert er auch hier einen nicht zugewiesenen pointer?</p>
</blockquote>
<p>Er (wer eigentlich?) dereferenziert wie gesagt einen <em>Nullzeiger</em>.</p>
<p>Nicht zugewiesen/nicht initialisiert wäre sowas:</p>
<pre><code class="language-cpp">int* ptr; // zeigt irgendwo hin
*ptr = 3; // !
</code></pre>
<p>Das ist ebenso verboten. Meistens sieht es sogar noch schlimmer aus als bei Nullzeigern, da der Fehler von Laufzeitumgebungen schlecht erkannt werden kann. Du hast dann typisches undefiniertes Verhalten. Wenn du Pech hast, läuft das Programm ungehindert weiter, überschreibt irgendwelche Daten und produziert nicht nachvollziehbare Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866058</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Mar 2010 17:26:35 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 17:33:54 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Matse schrieb:</p>
<blockquote>
<p>für mein ausgangsproblem läuft er bis nach unten druch und dereferenziert er auch hier einen nicht zugewiesenen pointer?</p>
</blockquote>
<p>Auch. Aber der Fehler funktioniert schon früher. Ich werde die Funktion mal inline machen und die Rekursion durch eine äquivalente Schleife ersetzen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main()
{
    int *m = NULL;

    for(int i=4;;--i)
    {
     std::cout &lt;&lt; &quot;It: &quot; &lt;&lt; i &lt;&lt; std::endl;
     if (i == 0)
      {
        *m = 3;
         break;
      }
    }

    std::cout &lt;&lt; &quot;ENDE: &quot; &lt;&lt; *m &lt;&lt; std::endl;
}
</code></pre>
<p>Dieser Code ist 1:1 äquivalent zu deinem Beispielprogramm. Fällt dir vielleicht jetzt etwas auf?</p>
</blockquote>
<p>also ich steh jetzt auf dem schlauch...<br />
so wie ich das sehe geht ja schon das hier nicht:</p>
<pre><code class="language-cpp">int main()
{
    int *m = NULL;

   *m = 3;
    std::cout &lt;&lt; &quot;ENDE: &quot; &lt;&lt; *m &lt;&lt; std::endl;
}
</code></pre>
<p>nur warum? Ich lege einen pointer auf einen int an - also eine speicherzelle die halt nicht existiert - das ist doch der fehler oder nicht? Also dass ich nicht auf eine variable zeige !? oder bin ich jetzt blöd?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866060</guid><dc:creator><![CDATA[Matse]]></dc:creator><pubDate>Mon, 08 Mar 2010 17:33:54 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 17:37:28 GMT]]></title><description><![CDATA[<p>Nein, das stimmt schon. Der Zeiger zeigt auf Null und somit auf keinen gültigen Speicher. Folglich darfst du ihn nicht dereferenzieren, weil du dann auf den Speicherbereich dahinter zugreifen würdest.</p>
<p>Hast du meinen vorherigen Beitrag noch gesehen? <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/1866064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866064</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Mar 2010 17:37:28 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 17:39:48 GMT]]></title><description><![CDATA[<p>ah verstehe - danke nexus. das war also schon die antwort. also hat mein problem nix mit rekursion zu tun sondern einfach was mit falscher dereferenzierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866067</guid><dc:creator><![CDATA[Matse]]></dc:creator><pubDate>Mon, 08 Mar 2010 17:39:48 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert diese rekursion nicht? on Mon, 08 Mar 2010 17:40:49 GMT]]></title><description><![CDATA[<p>Matse schrieb:</p>
<blockquote>
<p>Ich lege einen pointer auf einen int an - also eine speicherzelle die halt nicht existiert - das ist doch der fehler oder nicht? Also dass ich nicht auf eine variable zeige !? oder bin ich jetzt blöd?</p>
</blockquote>
<p>Du deklarierst einen Zeiger. Dieser ist default-initialisiert zeigt also &quot;irgendwo hin&quot;. Dieses &quot;irgendwo&quot; ist das Problem, denn an der Stelle wird wohl kein passendes Objekt liegen.<br />
Es gibt jetzt zwei Möglichkeiten:<br />
* Der Zeiger zeigt auf ein dynamisch erzsugtes Objekt<br />
* Der Zeiger zeigt auf ein Objekt auf dem Stack.<br />
Ersteres musst du manuell wieder freigeben, zweiteres wird automatisch freigegeben (also zerstört).<br />
Das Problem ist nun dass der Zeiger, wird er verwendet, auf etwa korrektes zeigen MUSS, sonst gibt das Speicherzugriffsfehler oder undefiniertes verhalten.<br />
Und wenn du einen unintialisierten Zeiger an eine Funttion übergibst die erwartet dass hinter dem Zeiger ein Objekt steht (also der Zeiger auf was konkretes zeigt), schaffst du dir Probleme - dein Programm macht nicht das was du willst, im besten Falle stürzt es (reprodutierbar) ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866069</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 08 Mar 2010 17:40:49 GMT</pubDate></item></channel></rss>